1 Introduction

The COVID-19 pandemic, caused by the novel coronavirus SARS-CoV-2, has had an unprecedented impact on global health, economies, and daily life since its emergence in late 2019. As the world fights with the challenges posed by this highly contagious virus, epidemiological data have been continuously gathered and released to the public, driving numerous researches and different approaches in trying to understand its patterns of transmission, to identify vulnerable populations, and to inform public health strategies. Due to the severity of the early stage of the pandemic and its wide impact on global production, data of high quality and accuracy were gathered in the nation through surveys and reports, so we believed that the COVID-19 data sets could be more informative and extensive than other epidemiology data.

In this assignment, we looked into the COVID-19 epidemiology data sets provided by Statistics Canada along with other related data sets. We attempted to answer three major questions in three subsections:

  1. We wanted to find if there was a possible relationship between the COVID pandemic and the death counts for 2020, 2021, 2022 and 2023. Through this question, one might be able to draw insights on whether the virus has had a dangerous impact on the overall public health.

  2. We gathered data of COVID-19 long term symptom among Canadian adults. We wanted to draw some conclusions on whether the virus had any impact on the long-term health condition of Canadians.

  3. We wanted to measure the relationship between the risk prevalence and some factors like vaccination status, chronic conditions and having or not a direct contact with people etc. By building a statistical model between the response and predictors, it helped us understand what procedures or conditions can affect the prevalence of COVID-19.

2 Method

2.1 Mortality

We used two data sets to explore the relationship between COVID-19 and the mortality in Canada. First data set is focus on the COVID-19 cases and death published by government of Canada to explore the number of new infections and deaths numbers in Canada and updates every Monday morning from Feb.01,2020 to Oct.28, 2023.

This first data set published by government of Canada(“COVID-19 Epidemiology Update:summary” 2023), it contains 2940 observations of 23 variables,including the total number of COVID-19 infections and deaths and their rates from January 2020 until the end of the reporting week, weekly and bi-weekly number of infection and deaths and their rates. Additionally, it includes the average daily death counts and rates derived from both weekly and bi-weekly data. In this section, our analysis emphasizes variables that pertain to both weekly and overall data. The data dictionary detailing the selected variables is provided below.

Table 2.1.1: COVID-19 Cases and Death Data Dictionary
Variables Type Example Number.Unique PctMissing Comment
prname character British Columbia, Alberta 15 0% English name of jurisdiction (province, territory, Canada)
date character 2020-02-01, 2020-02-08 196 0% Last day of the epidemiologic week for which the data represent. Epidemiological weeks are from Sunday to Saturday and this date will always fall on a Saturday.
reporting_year integer 2020, 2021 4 0% The calendar year associated with the epidemiologic week (based on the Fluwatch weeks calendar) in which the data was reported.(2020-2023)
totalcases integer 1, 0 2147 0% The total number of cases reported from January 2020 until the end of the reporting week in a jurisdiction.
numtotal_last7 numeric 1, 0 1407 9.42% Total number of cases during the reporting week for a jurisdiction, minus the total number of cases from that jurisdiction's previous week's update.
numdeaths integer 0, 1 1430 0% The total number of deaths reported from January 2020 until the end of the reporting week in a jurisdiction.
numdeaths_last7 numeric 0, 1 295 11.02% Total number of deaths for a jurisdiction, minus the total number of deaths from that jurisdiction's previous week's update.

From the Table 2.1.1, we found that the percentage of missing value in weekly cases and death counts are abound 10%, which is not good for our research. Missing values are mainly found in the northern and southeastern provinces and territories, such as Nunavut and Nova Scotia. In order to avoid the impact of missing values on the study, we use the total death and infections of COVID-19 in Canada instead of every province and terrotory in the following discussion.

Second data set is the provisional weekly death counts, by ages and sex from 2010 to 2023, published by Statistics Canada. This data set record the 149730 observations of 17 variables that are relevant for monitoring the impacts of mortality of every province and territory in Canada. We also deleted some variables which are irrelevant with our study or can not delivered the useful information in this data set. Such as variables like STATUS and TERMINATED are missing in all observation in this data set and variables DECIMALS and UOM_ID are the same for all variables. The data dictionary for remaining variables is provided below.

Table 2.1.2: Weekly Mortality Data Dictionary
Variables Type Example Number.Unique PctMissing Comment
REF_DATE character 2010-01-09, 2010-01-16 713 0% Reference period for the series being released.(2010-2023)
GEO character Canada, place of occurrence, Newfoundland and Labrador, place of occurrence 14 0% Name of dimension. There can be up to 10 dimensions in a data table. (i.e. Geography)
Age.at.time.of.death character Age at time of death, all ages, Age at time of death, 0 to 44 years 5 0% Age grouo when death occurred
Sex character Both sexes, Males 3 0% Sex
Characteristics character Number of deaths 1 0% Number of deaths
UOM character Number 1 0% The unit of measure applied to a member given in text.
VALUE integer 4955, 2535 1091 9.25% Total number of death under certain characteristics

The total number of death in this data set exist 9.25% missing data in raw data set, the missing data appears in all data after July 15, 2023. Because we only use the data in Canada with all age group and both sexes, the missing data only accounted for less than 1% of the data set we filtered. Therefore, we our study focused on the overall total death account and the number of COVID-19 deaths in Canada during the period January 2022 to July 2023.

In order to have better understanding about the mortality in Canada, we visualize the weekly death counts every year form 2010 to 2023 in Figure2.1.2, it is clear to see that the the number of annual deaths is increasing every year. The overall trend from 2010 to 2019 is similar, with an general decrease from the begging to the middle of the year then followed by an upward trend until the year end. In the middle of 2020 and the beginning of 2022, there exist two significant spikes on the figure. These pronounced increases in case counts raise the possibility that they may be attributed to distinct outbreaks of the epidemic.

To verify this conjecture, we showed the weekly number of death without the COVID-19 cases in Figure2.1.3. The spikes in 2020 and 2022 are removed but the small spike in mid-2021 still exist. So death counts rapid increase in 2020 and 2022 may caused by COVID-19 and we will discuss the probability of COVID-19 deaths in the total number of death condition on year in the following section.

2.2 Long-term Impact

The data of COVID-19 long term symptom among Canadian adults is from the Canadian COVID-19 Antibody and Health Survey (CCAHS) Cycle2. The survey collected the data over 3 collection periods between April 2022 and August 2022. The target population for this survey was adults 18 years of age and older living in the 10 provinces across Canada. Respondents who reported experiencing symptoms at least three months after a positive COVID-19 test were considered to have long-term symptoms.(“Long Term COVID-19 Symptoms Among Canadian Adults” 2023) The long term symptoms data used in this study has been pre-processed by Statistics Canada. It is grouped by sex and age groups. The measure is binary response from the respondents. The value shows the percentage of responses within each specific group. The confidence intervals are provided in the assessment of point estimates in case of high variability in the data.

The definition of main variables in the data is shown in following Table 2.2.1.

Table 2.2.1: Long Term Symptoms Data Definition
Variables Type Example Number.Unique PctMissing Comment
REF_DATE integer 2022 1 0% Reference Year (2022)
GEO character Canada 1 0% Geographic Location (Canada)
Measures character Yes, had long-term symptoms, No, did not have long-term symptoms 2 0% Does the respondent have the long term symptoms? Yes or No.
Sex character Both sexes, Males 3 0% Sex Category
Age.group character Ages 18 and over, Ages 18 to 34 5 0% Age Groups
Characteristics character Percent, Low 95% confidence interval, percent 3 0% Characteristics of the value, estimate or confidence interval
UOM character Percent 1 0% Unit of Measure (Percentage of the group)
VALUE numeric 16, 14.9 86 0% Data Value
DECIMALS integer 1 1 0% Number of Decimal Places in Value

In the study, we dropped variables like “REF_DATE”, “GEO” which contain the survey information and are the same across the entire data. A data of current COVID-19 cases in Canada (“Covid-19 Epidemiology Update: Current Situation” 2022) was used to estimate the missing variables necessary for the test we applied in later Section 3.2.

2.3 Prevalence Modeling

We used the Canadian COVID-19 Antibody and Health Survey (CCAHS) Cycle 1 microdata in modeling the prevelance. The CCAHS is collecting key information relevant to the pandemic to learn as much as possible about the virus, how it affects overall health, how it spreads, and whether Canadians are developing antibodies against it. (“Canadian Covid-19 Antibody and Health Survey (CCAHS)” 2021) The survey contained two parts, an electronic questionnaire and an at-home blood test. The questionnaire aimed to get general health and exposure conditions of participants, whereas the blood test was used to determine the presence of COVID-19 antibodies.

The survey was designed as cross-sectional and was given to individuals over 1 years old, excluding the population in remote areas of Canada. The data were sampled randomly from 30 strata created from each province. Due to the various size of the population of each stratum, Statistics Canada had to adjust the sample size in those strata with a larger population and higher proportion of COVID confirmed cases, ensuring a precise estimate of the prevalence. In addition, a two-stage sampling method was done at the household level, from which one of the household members was selected for the survey. In total, a sample size of 47900 people were selected and about 23.0% responded completely the survey.

The resulted data contained 10978 number of responses and 99 variables. Due to the large size of the number of variables, we only selected the ones that we were mostly interested in. We believed that the selected variables were most likely significant in modeling the prevalence before attempting to look into the data. After all, a variable showing if the respondent had a family doctor or not might be less likely to affect the prevalence than a variable showing the vaccination status. However, one must note that there might be predictors that could indirectly affect the response variable. For example, one could find the variable showing the response to the following question: “What are the reasons you would not get the COVID-19 vaccine? - Do not consider it necessary to get the vaccine”. This variable might have influence on the prevalence because no vaccine was given to the respondent. However, we thought that it was rather less informative because the information was already reflected in vaccination status. Therefore, we only chose those variables that can have a direct impact on the prevalence. Moreover, variables could have invalid categories like “Valid skip” or “Not stated”. These categories were present due to regulation and law reinforcement, and the survey is designed entirely voluntary. Therefore these categories were treated by us as missing data. Any variable with a high percentage of missing values (>25%) were dropped.

We gave a data definition in Table 2.3.1 below.

Table 2.3.1: COVID Status Data Definition
Variables Type Example Number.Unique PctMissing Comment
Covid_Status factor NA, No 3 70.31% Had the respondent ever had a positive test result?
chronic factor No, Yes 3 3.1% Had the respondent reported having chronic condition?
DirectContact factor Yes, NA 3 20.44% In the last six months, had the respondent worked in direct contact with people?
Smoke factor No, NA 3 19.12% Does the respondent currently smoke tobacco?
WashHand factor Always, Often 5 0.24% Wash hands often?
WearMask factor Always, NA 5 0.6% Wear a mask in indoor public spaces where physical distancing is difficult or a mandatory mask by-law exists?
Keep2m factor Often, Always 5 0.4% Keep a 2 meter or 6 foot distance from others?
AvoidCrowds factor Often, Always 5 0.9% Avoid crowds and large gatherings?
FluVac factor Yes, No 3 0.09% In the past 12 months, have you had a seasonal flu vaccine?
VaccineStatus factor No, NA 3 0.17% Received at least one vaccine dose against COVID-19?
Sex factor 2, 1 3 0.12% Sex: 1 - Male, 2 - Female
Age factor 3, 1 5 0.01% Age group: 1-19, 20-39, 40-59, 60 and older
NumHouse factor 3, 4 5 0.77% Number of people living in household: 1, 2, 3, and 4 or more
AntiBodyResult factor Negative, Indeterminate 3 0% The overall interpretation of the laboratory result is that if 0 of 3 antigen tests was positive, the respondent had an overall negative test for antibodies against SARS-CoV-2, if 1 of 3 antigen tests was positive, the respondent had an overall indeterminate test for antibodies against SARS-CoV-2, and if 2 or more of 3 antigen tests were positive, the respondent had an overall positive test for antibodies against SARS-CoV-2.

To fully understand the relationship between the response variable Covid_Status with other predictors, we fitted logistic models in Section 3.3 and provided additional inferences.

3 Result

3.1 Mortality

In order to discuss the probability of COVID-19 death in the total death, we first calculated the proportion for the COVID-19 death from 2020 to 2023 in Table 3.1.1. To our surprise, the proportion in 2022 is the higher than the proportion in 2020, 0.0574 and 0.0490 respectively. This might because the outbreak of the new variant Omicron. The proportion in 2021 and 2023 are relatively low might because the population of vaccination increase.

Table 3.1.1: Contingency table for proportion of COVID-19 death
Year Covid Death Not Covid Death
2020 0.0490 0.9510
2021 0.0463 0.9537
2022 0.0574 0.9426
2023 0.0231 0.9769

To test the homogeneity for COVID-19 death probability condition on years, we can use the Chi-square test and the null and alternative hypothesis of homogeneity corresponding to: \[\begin{gather*} H_0:P_{j|i}\ =\ P_{·j}\\ H_1:P_{j|i}\neq P_{·j} \end{gather*}\]

Table3.1.3:Result for test homogeneity between COVID-19 death and Year
Test Chi-Squared Statistic P-Value
Chi-squated test 3107.691 < 0.05
Likelihood ratio test 3538.714 < 0.05

The Chi-squares statistics computed by Chi-squared test and Likelihood ratio test is different but the p-value is less than 0.05 in both test. Thus we reject the null hypothesis under the 0.05 level since there have strong evidence that exist significant difference in probability in COVID-19 death probability condition on years.

Then we can compute the relative risk and odds ratio for years to measure the association between years and COVID-19 death proportion. We chose the COVID-19 death proportion in 2020 year as baseline category and compute the relative risks and odds ratios.

Table 3.1.4: Relative risks for three years
Year 2021 2022 2023
Relative risk 0.9449 1.1714 0.4714

Table 3.1.4 showed the Relative risks in 2021,2022 and 2023. We can see that relative risks in 2021,and 2023 are less than 1, we can concluded that if a people died in COVID-19, this people is more likely died in 2020 than 2021 and 2023. The relative risk in 2022 are greater than 1, we can concluded that if a people died in COVID-19, this people is more likely died in 2022 than 2020.

Table 3.1.5: Odds ratio for three years
Year 2021 2022 2023
Odds Ratio 1.0613 0.8461 2.179

From Table 3.1.5, we can see that the odds ratios for all three years are not equal to 1, which indicated that there exists association between year and COVID-19 death proportion. For odds ratios in 2021 and 2023, there exist positive association between probability of death caused by COVID-19. The association in 2022 is negative between proportion of COVID-19 death in total death.

3.2 Long-term Impact

As the data of COVID-19 long term symptom among Canadian adults did not contain the population size and population for each groups. We estimate the counts from the data of Weekly number of COVID-19 cases in Canada as of October 28, 2023. From the data of overall COVID-19 cases, we first grouped the data to the similar structure as our Long Term Symptom data. The data of other genders was dropped because that the count is too small comparing to the total population.

The data is first grouped by sex which consists of “males”, “females”, and “Both sexes”. “Both sexes” group contain the combined data from both males and females. Then the data is further grouped by age groups. Subgroup “Ages 18 and over” has the total count for the corresponding sex group. The proportion table with total count of subgroups is shown in the Table 3.2.1 below.

Table 3.2.1:Combined Data Showing Proportions and Counts by Sex and Age
Sex Age Group No, did not have long-term symptoms (Percent) Yes, had long-term symptoms (Percent) Count
Both sexes Ages 18 and over 84.0 16.0 3959044
Both sexes Ages 18 to 34 84.6 15.4 1506093
Both sexes Ages 35 to 49 84.3 15.7 657497
Both sexes Ages 50 to 64 83.3 16.7 1012269
Both sexes Ages 65 and over 82.2 17.8 783185
Females Ages 18 and over 79.9 20.1 2187574
Females Ages 18 to 34 82.1 17.9 851700
Females Ages 35 to 49 80.3 19.7 376243
Females Ages 50 to 64 77.8 22.2 534045
Females Ages 65 and over 75.6 24.4 425586
Males Ages 18 and over 88.0 12.0 1771470
Males Ages 18 to 34 87.0 13.0 654393
Males Ages 35 to 49 88.3 11.7 281254
Males Ages 50 to 64 88.9 11.1 478224
Males Ages 65 and over 89.2 10.8 357599

From the Table 3.2.1, we find that for females, higher proportion(24.4%) of respondents from age 65 and over reported long term symptoms. While males from ages 18 to 34 show a higher proportion(13%) to report long term symptoms. Overall(both sexes), higher proportion(17.8%) of adults from ages 65 and over reported long term symptoms. For all age groups, 20.1% of females reported long term symptoms comparing to only 12% of males.

To study the association between age groups and the long term symptoms, A Chi-square test was conducted within each sex group. The hypothesis of independence corresponds to \(H_0:p_{ij}=p_{i\cdot}p_{\cdot j}, \forall i,j\). Under each sex group, a \(4\times2\) contingency is constructed. We have age groups as the row variable , response of long term symptoms as the column variable. Counts for specific responses “Yes, had long-term symptoms” and “No, did not have long-term symptoms” are estimated using the corresponding proportion and the total counts of each subgroup.

A similar Chi-square test was applied to test the association between sex and the long term symptoms. Under each age group, a \(2\times2\) contingency table is constructed with sex as the row variable and long term symptoms as the column variable.

Test results are shown in the following table.

Table 3.2.2: Chi-Squared Test Results of Age groups and Long term symptoms
Sex Chi-Squared Statistic P-Value
Males 1,470.535 < 0.05
Females 8,591.285 < 0.05
Both sexes 2,477.967 < 0.05

Table 3.2.2 shows the results of Chi-squared tests comparing the Occurrence of long-term COVID-19 symptoms across different age groups within each sex category and for both sexes combined.For all categories (Males, Females, and Both Sexes), the Chi-squared statistics are high, and the p-values are less than 0.05.This suggests that within each of these categories, there is a statistically significant association between age group and the occurrence of long-term COVID-19 symptoms. The differences in symptom frequencies across age groups are not likely to be due to random chance.

Table 3.2.3: Chi-Squared Test Results of Sex and Long term symptoms
Age Group Chi-Squared Statistic P-Value
Ages 18 and over 46,667.640 < 0.05
Ages 18 to 34 6,688.341 < 0.05
Ages 35 to 49 7,557.410 < 0.05
Ages 50 to 64 22,075.403 < 0.05
Ages 65 and over 24,150.716 < 0.05

Table 3.2.3 presents the results of Chi-squared tests comparing the occurrence of long-term COVID-19 symptoms between males and females within each age group.Each age group shows a very high Chi-squared statistic with all p-values being less than 0.05. These results indicate a statistically significant association between sex and the occurrence of long-term COVID-19 symptoms in each age group.

To further explore the strength of the association. We calculated odds ratios primarily between males and females in each age group. For each age group, the odds of females experiencing long-term symptoms are compared to the odds for males. An OR greater than 1 indicates a higher likelihood for females. The results are shown in Table 3.2.4.

Table 3.2.4: Odds Ratios of Long-term COVID-19 Symptoms: Females vs Males by Age Group
Age Group Odds Ratio
Ages 18 and over 1.845
Ages 18 to 34 1.459
Ages 35 to 49 1.851
Ages 50 to 64 2.285
Ages 65 and over 2.666

Across all age groups, females are consistently more likely than males to report long-term COVID-19 symptoms, as indicated by odds ratios greater than 1 in each category. The odds ratios seem to increase with age. The highest disparity between females and males is observed in the oldest age group (Ages 65 and over).

3.3 Prevalence Modeling

The hypothesis we were mostly interested in was:

\[\begin{gather*} H_0: \beta_j = 0 \\ H_0: \beta_j \neq 0 \end{gather*}\]

for each coefficient related to its corresponding covariate. In other words, we wanted to describe the relationship between the COVID status of a participant and other predictors. We selected the model with the least AIC value shown in Table 3.3.1.

Table 3.3.1: Complete List of Models For COVID Status Estimation
Intercept AntiBodyResult VaccineStatus DirectContact FluVac chronic NumHouse Smoke Sex Age WashHand AvoidCrowds Keep2m WearMask logLikelihood AIC
1 0 0 0 0 0 0 0 0 0 0 0 0 0 -353.1412 706.2824
1 1 0 0 0 0 0 0 0 0 0 0 0 0 -187.0380 378.0760
1 1 1 0 0 0 0 0 0 0 0 0 0 0 -138.9752 283.9504
1 1 1 1 0 0 0 0 0 0 0 0 0 0 -137.4942 282.9884
1 1 1 1 1 0 0 0 0 0 0 0 0 0 -136.4851 282.9702
1 1 1 1 1 1 0 0 0 0 0 0 0 0 -135.6459 283.2917
1 1 1 1 1 1 1 0 0 0 0 0 0 0 -133.1663 284.3326
1 1 1 1 1 1 1 1 0 0 0 0 0 0 -133.0229 286.0457
1 1 1 1 1 1 1 1 1 0 0 0 0 0 -132.9915 287.9831
1 1 1 1 1 1 1 1 1 1 0 0 0 0 -131.5871 291.1742
1 1 1 1 1 1 1 1 1 1 1 0 0 0 -130.5807 295.1614
1 1 1 1 1 1 1 1 1 1 1 1 0 0 -130.0206 300.0412
1 1 1 1 1 1 1 1 1 1 1 1 1 0 -129.6772 305.3545
1 1 1 1 1 1 1 1 1 1 1 1 1 1 -129.5168 311.0336

Our best model had the following coefficients shown in the summary Table 3.3.2, from which we found that the variable FluVac that indicated whether or not the participant had a flu shot for the past 12 months had a p-value = 0.155 not significant enough, so we did not have a conclusion on whether the variable was associated with the response.


Table 3.3.2: Summary of Model with Lowest AIC
=======================================================
                                Dependent variable:    
                            ---------------------------
                                   Covid_Status        
-------------------------------------------------------
DirectContactYes                      -0.706*          
                                     (0.364)*          
                                     p = 0.053         
                                                       
FluVacYes                             -0.507           
                                      (0.356)          
                                     p = 0.155         
                                                       
VaccineStatusYes                     -4.244***         
                                    (0.768)***         
                                    p = 0.00000        
                                                       
AntiBodyResultIndeterminate          3.414***          
                                    (0.503)***         
                                     p = 0.000         
                                                       
AntiBodyResultPositive               6.617***          
                                    (0.441)***         
                                     p = 0.000         
                                                       
Constant                             -4.959***         
                                    (0.429)***         
                                     p = 0.000         
                                                       
-------------------------------------------------------
Observations                           2,372           
Log Likelihood                       -136.485          
Akaike Inf. Crit.                     284.970          
=======================================================
Note:                       *p<0.1; **p<0.05; ***p<0.01

We looked at the AIC when the flu vaccine status variable was removed. One can see in Table 3.3.3 below that there was not much difference in the AIC value. For model simplicity we therefore omitted the variable.

Table 3.3.3: Model AIC Comparison with FluVac Removed
chronic DirectContact Smoke WashHand WearMask Keep2m AvoidCrowds FluVac VaccineStatus Sex Age NumHouse AntiBodyResult Criterion
FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE 282.9702
FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE 282.9884

Similarly, from summary Table 3.3.2 above we found that the variable DirectContact that showed whether the participant had directed contact with people or not also had an unpromising p-value=0.053. After removing the FluVac variable first, we compared the models with and without DirectContact variable using the deviance. From the following summary Table 3.3.4 one can see that the p-value of the Chi-squared statistic was 0.085, suggesting again that we did not have a conclusion whether or not there was an association between the COVID status and having direct contact with people.


Table 3.3.4: Validation of DirectContact Variable
================================================================
           Resid. Df  Resid. Dev     Df      Deviance  Pr(> Chi)
----------------------------------------------------------------
1            2,367     274.988                                  
2            2,368     277.950       -1       -2.962     0.085  
----------------------------------------------------------------
Model 1: y ~ DirectContact + VaccineStatus + AntiBodyResult     
Model 2: y ~ VaccineStatus + AntiBodyResult                     

We again dropped the variable DirectContact because the AIC didn’t change significantly after removal:

Table 3.3.5: Model AIC Comparison with DirectContact Removed
Intercept chronic DirectContact Smoke WashHand WearMask Keep2m AvoidCrowds FluVac VaccineStatus Sex Age NumHouse AntiBodyResult logLikelihood AIC
TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE -138.9752 283.9504
TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE -137.4942 282.9884

Therefore, we concluded that our model was: \[\begin{equation*} \ln{(\frac{p_i}{1-p_i})} = -5.565 -4.568 \times \text{VaccineStatusYes}_i +3.392 \times \text{AntiBodyResultIndeterminate}_i +6.602 \times \text{AntiBodyResultPositive}_i \end{equation*}\]

from the following summary Table 3.3.6:


Table 3.3.6: Summary of Final Model
=======================================================
                                Dependent variable:    
                            ---------------------------
                                   Covid_Status        
-------------------------------------------------------
VaccineStatusYes                     -4.568***         
                                    (0.759)***         
                                     p = 0.000         
                                                       
AntiBodyResultIndeterminate          3.392***          
                                    (0.499)***         
                                     p = 0.000         
                                                       
AntiBodyResultPositive               6.602***          
                                    (0.432)***         
                                     p = 0.000         
                                                       
Constant                             -5.565***         
                                    (0.354)***         
                                     p = 0.000         
                                                       
-------------------------------------------------------
Observations                           2,372           
Log Likelihood                       -138.975          
Akaike Inf. Crit.                     285.950          
=======================================================
Note:                       *p<0.1; **p<0.05; ***p<0.01

We further did another model estimation for the COVID status and some preventative behaviours like washing hands, wearing masks, keep 2 metres and avoiding crowds. The result in summary Table 3.3.7 showed that only washing hands often an always were significant enough to be negatively related to the COVID status whereas all other covariates were inconclusive.


Table 3.3.7: Model Estimates of COVID Status with Preventative Behaviours
===================================================
                            Dependent variable:    
                        ---------------------------
                               Covid_Status        
---------------------------------------------------
WashHandOccasionally              -2.282*          
                                 (1.368)*          
                                 p = 0.096         
                                                   
WashHandOften                    -2.921**          
                                 (1.345)**         
                                 p = 0.030         
                                                   
WashHandAlways                   -2.704**          
                                 (1.345)**         
                                 p = 0.045         
                                                   
WearMaskOccasionally              11.313           
                                 (508.697)         
                                 p = 0.983         
                                                   
WearMaskOften                     11.687           
                                 (508.696)         
                                 p = 0.982         
                                                   
WearMaskAlways                    11.391           
                                 (508.696)         
                                 p = 0.983         
                                                   
Keep2mOccasionally                -0.534           
                                  (1.162)          
                                 p = 0.646         
                                                   
Keep2mOften                       -0.705           
                                  (1.141)          
                                 p = 0.537         
                                                   
Keep2mAlways                      -0.558           
                                  (1.142)          
                                 p = 0.625         
                                                   
AvoidCrowdsOccasionally           -1.526*          
                                 (0.902)*          
                                 p = 0.091         
                                                   
AvoidCrowdsOften                  -1.057           
                                  (0.699)          
                                 p = 0.131         
                                                   
AvoidCrowdsAlways                 -0.807           
                                  (0.684)          
                                 p = 0.238         
                                                   
Constant                          -10.291          
                                 (508.699)         
                                 p = 0.984         
                                                   
---------------------------------------------------
Observations                       3,202           
Log Likelihood                   -559.450          
Akaike Inf. Crit.                1,144.899         
===================================================
Note:                   *p<0.1; **p<0.05; ***p<0.01

4 Discussion

4.1 Mortality

From Section 3.1, we found that the probability of death caused by COVID-19 is not homogeneous across years, then we computed the relative risks and odds ratios for 2021,2022 and 2023. We observed that relative risk in 2022 (RR = 1.1714) indicates a higher risk compared to the 2020, while relative risk in 2021 (RR = 0.9449) suggests a slightly lower risk. Notably, relative risk in 2023 (RR = 0.4714) stands out with a significantly lower risk, suggesting a potential protective effect. The odds ratio in 2023 (OR = 2.179) stands out, indicating a significantly higher odds compared to the odds in 2020. In contrast, odds ratio in 2022 (OR = 0.8461) suggests a lower odds, while odds ratio in 2021 (OR = 1.0613) demonstrates a subtle increase.

The lower risk and higher odds in 2021 and 2023 might because the widespread vaccination in Canada. Public Health Ontario states(“Comparison of COVID-19 Hospitalizations and Deaths in 2022 and 2021” 2023) that over 70.2% of Ontario residents received at least one dose of COVID-19 vaccine in the full year 2021, over 60% completed two doses vaccination. Also, the vaccine still has high vaccine effectiveness against variants of concern Alpha and delta. Till October 2023, 80.5% people in total population in Canada completed their primary series vaccination, over 4 million people received booster dose Pfizer-BioNTech Comirnaty vaccine(“COVID-19 Vaccination:vaccination Coverage” 2023). The public health restrictions and mandatory masking policies dropped, there has also been a shift from the young to the old, with more than 80% of deaths occurring in patients over 65 years old with comorbidities(“2022 Was the Deadliest Year of the COVID-19 Pandemic in b.c. What’s Next?” 2022).

4.2 Long-term Impact

Based on the results from section 3.2, The Chi-squared tests revealed statistically significant associations between age groups and the occurrence of long-term COVID-19 symptoms within each sex category and between sexes within each age group. The Odds Ratios consistently showed that females are more likely than males to report long-term COVID-19 symptoms in all age groups.This disparity in the likelihood of symptoms appears to increase with age, with the oldest age group (Ages 65 and over) showing the highest Odds Ratio.

Our findings resonate with several clinical studies that have suggested gender difference in the impact of long_COVID-19 syndrome.Specifically, the higher likelihood of long-term symptoms in females is consistent with public health researches that women might experience COVID-19 differently than men.(Bai et al. 2021) However our study is based on aggregated data focusing primarily on the association of sex and age with long-term COVID-19 symptoms. While this provides valuable insights, the data does not include individual patient states that could influence the findings. Moreover, The nature of the data and the analytical methods used (Chi-squared tests and Odds Ratios) are effective for identifying associations but do not establish causation.

Further studies involving more detailed data should aim to uncover the biological, social, and behavioral mechanisms driving the observed gender differences in long-term COVID-19 symptoms. Some study(Juszko et al. 2022) suggests that psychological factors also have correlation in both women and men with self-reported health after COVID-19. The study clearly indicates a significant gender disparity in the mental health impact of COVID-19 during the recuperation period.

4.3 Prevalence Modeling

From Section 3.3 we have found that the odds ratio of COVID-19 was related to two covariates: the vaccination status and the antibody presented in blood. Specifically, we interpreted the coefficients as the log-odds for its corresponding covariate.

\[ \ln{OR}=\beta_j, \quad OR:=\frac{p_2(1-p_1)}{p_1(1-p_2)} \]

In other words, \(e^{\beta_j}\) is the marginal increase/decrease in the odds for a on-unit increase/decrease in the covariate, assuming all other covariates held constant. On the other hand, the constant coefficient \(\beta_0\) is interpreted as the log-odds \(\ln{(\frac{p_1}{1-p_1})}\) with all covariates unchanged. From our summary Table 3.3.6 one can see that the coefficient for the vaccine status was negative, indicating that the odds of having a positive COVID test decreases if vaccine was given. This result wasn’t surprising that the use of vaccines has so far helped the humanity combat this virus. The coefficient for the indeterminate antibody result was positive, and the one for the positive antibody result was even higher. We must point out that one needs to carefully interpret this result. It meant that the odds of getting a positive COVID test is positively correlated with the result of an antibody test. The more positive the antibody test is, the higher the odds of having a positive COVID test as well. However, antibody test and the COVID-19 diagnostic test are not the same thing in the explainations provided by FDA (“Antibody (Serology) Testing for Covid-19” 2023). The antibody test does not detect the virus. Rather, it merely tells if a person may have had a PRIOR infection, thus it does not reflect if the person is currently infected or not. In addition, the antibody test could show if a person has been vaccinated or not, but in general an antibody test may not detect the kind of antibodies created by vaccines, therefore it depends on the type of antibody test performed. From our result we were only able to say that there was a positive relationship between the COVID diagnostic test and the antibody test, which was not surprising because in order to show positive in an antibody test, one must have had COVID to begin with. This information may be useful, for example, that one of the tests is economically more affordable and can be used as a preliminary screening method.

From the second model fitting for preventative behaviours, we found that only washing hand was showing a negative effect on the odds of getting COVID. We weren’t able to draw any conclusion for other preventative behaviours, but we thought it was inevitably hard to find a relationship between the COVID status and those behaviours because people may not answer the questionnaire accurately. People might find difficult to distinguish the boundary between wearing mask often and always. People can even falsely answer that they keep a distance of 2 metres or more but in reality they have not done so. The resulting answers for the survey therefore may not be as reliable. Thus we thought it is generally difficult to accurately describe the relationship between prevalence of disease and preventative behaviour. Researchers have to design experiments and find ways to quantify the behaviour in order to have more reliable outcomes.

5 Conclusion

In Mortality section, we found that there exist significant difference in probability of death caused by COVID-19 across years. 2022 has the relative risk greater than 1 and odds ratio less than 1, which indicate the negative association, indicating an decreased likelihood of the in probability in COVID-19 death in these years.Given the change in the demographic of the affected population, it is essential to acknowledge the possibility that the rise in mortality among older individuals in the later stages of the epidemic could be attributed to complications rather than the direct impact of COVID-19 itself. In future research, it would be valuable to explore the influence of complications on the death after infections.

we can conclude that there is a significant association between age and gender with the occurrence of long-term COVID-19 symptoms. Notably, females across all age groups, especially those aged 65 and over, are more likely to report these symptoms compared to males.However, it’s important to recognize that our study, while highlighting crucial associations, does not delve into the causal mechanisms due to its reliance on aggregated data. This limitation underscores the need for further research with more comprehensive data to explore the underlying biological, social, and psychological factors contributing to these observed differences in long-term COVID-19 symptoms.

We found in Prevalence Modeling section that the COVID status is negatively associated with the vaccination status, indicating that vaccines was a significant factor to lower the prevalence of the virus. We also found but not surprising that the antibody test result was positively related to the COVID status. In addition, we did confirm that washing hands can result in a negative influence on the prevalence of COVID, but we could not find the same conclusion for other preventative behaviours.

6 References

“2022 Was the Deadliest Year of the COVID-19 Pandemic in b.c. What’s Next?” 2022. Akshay Kulkarni. https://www.cbc.ca/news/canada/british-columbia/2022-covid-year-in-review-1.6699063.
“Antibody (Serology) Testing for Covid-19.” 2023. U.S. Food and Drug Administration. https://www.fda.gov/medical-devices/coronavirus-covid-19-and-medical-devices/antibody-serology-testing-covid-19-information-patients-and-consumers#:~:text=A%3A%20A%20positive%20antibody%20test,to%20a%20COVID-19%20vaccine.
Bai, Francesca, Daniele Tomasoni, Camilla Falcinella, Diletta Barbanotti, Roberto Castoldi, Giovanni Mulè, Matteo Augello, et al. 2021. “Female Gender Is Associated with Long COVID Syndrome: A Prospective Cohort Study” 28 (4): 611.e9–16.
“Canadian Covid-19 Antibody and Health Survey (CCAHS).” 2021. Surveys and Statistical Programs. Government of Canada, Statistics Canada. https://www23.statcan.gc.ca/imdb/p2SV.pl?Function=getSurvey&amp;Id=1287991.
“Comparison of COVID-19 Hospitalizations and Deaths in 2022 and 2021.” 2023. Public Health Ontario. https://www.publichealthontario.ca/-/media/Documents/nCoV/epi/2023/03/comparison-covid-19-hospitalizations-deaths-epi-summary.pdf?rev=c9518fca8cac4f199f088154e4012853&sc_lang=en#:~:text=COVID%2D19%20deaths%20was%2039,(37.0%20per%20100%2C000%20population).&text=The%20rate%20of%20COVID%2D19%20deaths%20per%20100%2C000%20population%20was,in%202022%20compared%20to%202021.
“Covid-19 Epidemiology Update: Current Situation.” 2022. Public Health Agency of Canada. https://health-infobase.canada.ca/covid-19/current-situation.html?stat=num&amp;measure=cases_total&amp;map=pt#a2.
“COVID-19 Epidemiology Update:summary.” 2023. Public Health Agency of Canada. https://health-infobase.canada.ca/covid-19/.
“COVID-19 Vaccination:vaccination Coverage.” 2023. Government of Canada, statistics canada. https://health-infobase.canada.ca/covid-19/vaccination-coverage/.
Juszko, Karolina, Patryk Szary, Justyna Mazurek, Sebastian Rutkowski, Błażej Cieślik, Joanna Szczepańska-Gieracha, and Robert Gajda. 2022. Long-Term Consequences of COVID-19 Disease Specific to Women: Exploratory Research.” Int J Environ Res Public Health 20 (1).
“Long Term COVID-19 Symptoms Among Canadian Adults.” 2023. Government of Canada, Statistics Canada. https://www23.statcan.gc.ca/imdb/p2SV.pl?Function=getSurvey&amp;SDDS=5339.
LS0tCnRpdGxlOiAiTUFUNTMxNyBDYXRlZ29yaWNhbCBBc3NpZ25tZW50IDIiCmF1dGhvcjoKLSBUZW5nIExpKDczNzMwODYpCi0gWmhpemUgTHUoMzAwMDc1MTE0KQotIENodXRvbmcgWmhhbmcoMzAwMzExMzI1KQpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6IAogICAgdG9jOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBmaWdfY2FwdGlvbjogeWVzCmhlYWRlci1pbmNsdWRlczoKLSBccmVuZXdjb21tYW5ke1xhbmR9e1xcfQotIFx1c2VwYWNrYWdle2Zsb2F0fQotIFxmbG9hdHBsYWNlbWVudHtmaWd1cmV9e0h9CmJpYmxpb2dyYXBoeTogUmVmZXJlbmNlcy5iaWIKbGluay1jaXRhdGlvbnM6IHllcwotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ci50aXRsZSwgLmF1dGhvcnt0ZXh0LWFsaWduOiBjZW50ZXI7fQpib2R5e2ZvbnQtc2l6ZTogMTJwdDt9CnRhYmxle2ZvbnQtc2l6ZTogMTJwdDt9Cmgxe2ZvbnQtc2l6ZTogMTRwdDt9Cmgye2ZvbnQtc2l6ZTogMTJwdDt9Cjwvc3R5bGU+CgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGJlc3RnbG0pCmxpYnJhcnkoZ3QpCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KERlc2NUb29scykKYGBgCgpgYGB7cn0KQ0NBSFM8LXJlYWQuY3N2KCJDQ0FIUy5jc3YiLCBoZWFkZXIgPSBUUlVFKQpDb3ZpZDwtcmVhZC5jc3YoIkNvdmlkLmNzdiIsIGhlYWRlciA9IFRSVUUpCkNvdmlkX2FHPC1yZWFkLmNzdigiQ09WSURfQWdlR2VuZGVyLmNzdiIsIGhlYWRlciA9IFRSVUUpCldNb3J0YWxpdHk8LXJlYWQuY3N2KCJXZWVrbHlNb3J0YWxpdHkuY3N2IiwgaGVhZGVyID0gVFJVRSkKRXhNb3J0YWxpdHk8LXJlYWQuY3N2KCJFeGNlc3NNb3J0YWxpdHkuY3N2IiwgaGVhZGVyID0gVFJVRSkKTG9uZ1Rlcm08LXJlYWQuY3N2KCJMb25nVGVybS5jc3YiLCBoZWFkZXIgPSBUUlVFKQpgYGAKCiMgSW50cm9kdWN0aW9uCgpUaGUgQ09WSUQtMTkgcGFuZGVtaWMsIGNhdXNlZCBieSB0aGUgbm92ZWwgY29yb25hdmlydXMgU0FSUy1Db1YtMiwgaGFzIGhhZCBhbiB1bnByZWNlZGVudGVkIGltcGFjdCBvbiBnbG9iYWwgaGVhbHRoLCBlY29ub21pZXMsIGFuZCBkYWlseSBsaWZlIHNpbmNlIGl0cyBlbWVyZ2VuY2UgaW4gbGF0ZSAyMDE5LiBBcyB0aGUgd29ybGQgZmlnaHRzIHdpdGggdGhlIGNoYWxsZW5nZXMgcG9zZWQgYnkgdGhpcyBoaWdobHkgY29udGFnaW91cyB2aXJ1cywgZXBpZGVtaW9sb2dpY2FsIGRhdGEgaGF2ZSBiZWVuIGNvbnRpbnVvdXNseSBnYXRoZXJlZCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYywgZHJpdmluZyBudW1lcm91cyByZXNlYXJjaGVzIGFuZCBkaWZmZXJlbnQgYXBwcm9hY2hlcyBpbiB0cnlpbmcgdG8gdW5kZXJzdGFuZCBpdHMgcGF0dGVybnMgb2YgdHJhbnNtaXNzaW9uLCB0byBpZGVudGlmeSB2dWxuZXJhYmxlIHBvcHVsYXRpb25zLCBhbmQgdG8gaW5mb3JtIHB1YmxpYyBoZWFsdGggc3RyYXRlZ2llcy4gRHVlIHRvIHRoZSBzZXZlcml0eSBvZiB0aGUgZWFybHkgc3RhZ2Ugb2YgdGhlIHBhbmRlbWljIGFuZCBpdHMgd2lkZSBpbXBhY3Qgb24gZ2xvYmFsIHByb2R1Y3Rpb24sIGRhdGEgb2YgaGlnaCBxdWFsaXR5IGFuZCBhY2N1cmFjeSB3ZXJlIGdhdGhlcmVkIGluIHRoZSBuYXRpb24gdGhyb3VnaCBzdXJ2ZXlzIGFuZCByZXBvcnRzLCBzbyB3ZSBiZWxpZXZlZCB0aGF0IHRoZSBDT1ZJRC0xOSBkYXRhIHNldHMgY291bGQgYmUgbW9yZSBpbmZvcm1hdGl2ZSBhbmQgZXh0ZW5zaXZlIHRoYW4gb3RoZXIgZXBpZGVtaW9sb2d5IGRhdGEuCgpJbiB0aGlzIGFzc2lnbm1lbnQsIHdlIGxvb2tlZCBpbnRvIHRoZSBDT1ZJRC0xOSBlcGlkZW1pb2xvZ3kgZGF0YSBzZXRzIHByb3ZpZGVkIGJ5IFN0YXRpc3RpY3MgQ2FuYWRhIGFsb25nIHdpdGggb3RoZXIgcmVsYXRlZCBkYXRhIHNldHMuIFdlIGF0dGVtcHRlZCB0byBhbnN3ZXIgdGhyZWUgbWFqb3IgcXVlc3Rpb25zIGluIHRocmVlIHN1YnNlY3Rpb25zOgoKMS4gV2Ugd2FudGVkIHRvIGZpbmQgaWYgdGhlcmUgd2FzIGEgcG9zc2libGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIENPVklEIHBhbmRlbWljIGFuZCB0aGUgZGVhdGggY291bnRzIGZvciAyMDIwLCAyMDIxLCAyMDIyIGFuZCAyMDIzLiBUaHJvdWdoIHRoaXMgcXVlc3Rpb24sIG9uZSBtaWdodCBiZSBhYmxlIHRvIGRyYXcgaW5zaWdodHMgb24gd2hldGhlciB0aGUgdmlydXMgaGFzIGhhZCBhIGRhbmdlcm91cyBpbXBhY3Qgb24gdGhlIG92ZXJhbGwgcHVibGljIGhlYWx0aC4KCjIuIFdlIGdhdGhlcmVkIGRhdGEgb2YgQ09WSUQtMTkgbG9uZyB0ZXJtIHN5bXB0b20gYW1vbmcgQ2FuYWRpYW4gYWR1bHRzLiBXZSB3YW50ZWQgdG8gZHJhdyBzb21lIGNvbmNsdXNpb25zIG9uIHdoZXRoZXIgdGhlIHZpcnVzIGhhZCBhbnkgaW1wYWN0IG9uIHRoZSBsb25nLXRlcm0gaGVhbHRoIGNvbmRpdGlvbiBvZiBDYW5hZGlhbnMuCgozLiBXZSB3YW50ZWQgdG8gbWVhc3VyZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJpc2sgcHJldmFsZW5jZSBhbmQgc29tZSBmYWN0b3JzIGxpa2UgdmFjY2luYXRpb24gc3RhdHVzLCBjaHJvbmljIGNvbmRpdGlvbnMgYW5kIGhhdmluZyBvciBub3QgYSBkaXJlY3QgY29udGFjdCB3aXRoIHBlb3BsZSBldGMuIEJ5IGJ1aWxkaW5nIGEgc3RhdGlzdGljYWwgbW9kZWwgYmV0d2VlbiB0aGUgcmVzcG9uc2UgYW5kIHByZWRpY3RvcnMsIGl0IGhlbHBlZCB1cyB1bmRlcnN0YW5kIHdoYXQgcHJvY2VkdXJlcyBvciBjb25kaXRpb25zIGNhbiBhZmZlY3QgdGhlIHByZXZhbGVuY2Ugb2YgQ09WSUQtMTkuICAKCiMgTWV0aG9kCgojIyBNb3J0YWxpdHkKV2UgdXNlZCB0d28gZGF0YSBzZXRzIHRvIGV4cGxvcmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIENPVklELTE5IGFuZCB0aGUgbW9ydGFsaXR5IGluIENhbmFkYS4gRmlyc3QgZGF0YSBzZXQgaXMgZm9jdXMgb24gdGhlIENPVklELTE5IGNhc2VzIGFuZCBkZWF0aCBwdWJsaXNoZWQgYnkgZ292ZXJubWVudCBvZiBDYW5hZGEgdG8gZXhwbG9yZSB0aGUgbnVtYmVyIG9mIG5ldyBpbmZlY3Rpb25zIGFuZCBkZWF0aHMgbnVtYmVycyBpbiBDYW5hZGEgYW5kIHVwZGF0ZXMgZXZlcnkgTW9uZGF5IG1vcm5pbmcgZnJvbSBGZWIuMDHvvIwyMDIwIHRvIE9jdC4yOCwgMjAyMy4gCgpUaGlzIGZpcnN0IGRhdGEgc2V0IHB1Ymxpc2hlZCBieSBnb3Zlcm5tZW50IG9mIENhbmFkYVtAR09DXSwgaXQgY29udGFpbnMgMjk0MCBvYnNlcnZhdGlvbnMgb2YgMjMgdmFyaWFibGVzLGluY2x1ZGluZyB0aGUgdG90YWwgbnVtYmVyIG9mIENPVklELTE5IGluZmVjdGlvbnMgYW5kIGRlYXRocyBhbmQgdGhlaXIgcmF0ZXMgZnJvbSBKYW51YXJ5IDIwMjAgdW50aWwgdGhlIGVuZCBvZiB0aGUgcmVwb3J0aW5nIHdlZWssIHdlZWtseSBhbmQgYmktd2Vla2x5IG51bWJlciBvZiBpbmZlY3Rpb24gYW5kIGRlYXRocyBhbmQgdGhlaXIgcmF0ZXMuIEFkZGl0aW9uYWxseSwgaXQgaW5jbHVkZXMgdGhlIGF2ZXJhZ2UgZGFpbHkgZGVhdGggY291bnRzIGFuZCByYXRlcyBkZXJpdmVkIGZyb20gYm90aCB3ZWVrbHkgYW5kIGJpLXdlZWtseSBkYXRhLiBJbiB0aGlzIHNlY3Rpb24sIG91ciBhbmFseXNpcyBlbXBoYXNpemVzIHZhcmlhYmxlcyB0aGF0IHBlcnRhaW4gdG8gYm90aCB3ZWVrbHkgYW5kIG92ZXJhbGwgZGF0YS4gVGhlIGRhdGEgZGljdGlvbmFyeSBkZXRhaWxpbmcgdGhlIHNlbGVjdGVkIHZhcmlhYmxlcyBpcyBwcm92aWRlZCBiZWxvdy4KYGBge3J9CiNkYXRhIGRpY3Rpb25hcnk6Q292aWQgY2FzZXMgYW5kIGRlYXRoCkNPVklEPC1Db3ZpZCU+JQogIHNlbGVjdChwcm5hbWUsZGF0ZSxyZXBvcnRpbmdfeWVhcix0b3RhbGNhc2VzLG51bXRvdGFsX2xhc3Q3LG51bWRlYXRocyxudW1kZWF0aHNfbGFzdDcpCgpDb3ZpZEREPC1kYXRhLmZyYW1lKAogIFZhcmlhYmxlcz1jb2xuYW1lcyhDT1ZJRCksICAgCiAgVHlwZT1zYXBwbHkoQ09WSUQsIGZ1bmN0aW9uKHgpIGNsYXNzKHgpKSwKICBFeGFtcGxlPXNhcHBseShDT1ZJRCwgZnVuY3Rpb24oeCkgcGFzdGUoYXMuY2hhcmFjdGVyKGhlYWQodW5pcXVlKHgpLDIpKSwgY29sbGFwc2UgPSAiLCAiKSksCiAgTnVtYmVyLlVuaXF1ZT1zYXBwbHkoQ09WSUQsIGZ1bmN0aW9uKHgpIGxlbmd0aCh1bmlxdWUoeCkpKSwKICBQY3RNaXNzaW5nPXNhcHBseShDT1ZJRCwgZnVuY3Rpb24oeCkgcGFzdGUwKHJvdW5kKHN1bShpcy5uYSh4KSkvbGVuZ3RoKHgpLCA0KSoxMDAsIiUiKSksCiAgQ29tbWVudD1jKCAiRW5nbGlzaCBuYW1lIG9mIGp1cmlzZGljdGlvbiAocHJvdmluY2UsIHRlcnJpdG9yeSwgQ2FuYWRhKSIsCiAgICAgICAgICAgICAgIkxhc3QgZGF5IG9mIHRoZSBlcGlkZW1pb2xvZ2ljIHdlZWsgZm9yIHdoaWNoIHRoZSBkYXRhIHJlcHJlc2VudC4gRXBpZGVtaW9sb2dpY2FsIHdlZWtzIGFyZSBmcm9tIFN1bmRheSB0byBTYXR1cmRheSBhbmQgdGhpcyBkYXRlIHdpbGwgYWx3YXlzIGZhbGwgb24gYSBTYXR1cmRheS4iLAogICAgICAgICAgICAgIlRoZSBjYWxlbmRhciB5ZWFyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXBpZGVtaW9sb2dpYyB3ZWVrIChiYXNlZCBvbiB0aGUgRmx1d2F0Y2ggd2Vla3MgY2FsZW5kYXIpIGluIHdoaWNoIHRoZSBkYXRhIHdhcyByZXBvcnRlZC4oMjAyMC0yMDIzKSIsCiAgICAgICAgICAgICAgIlRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgcmVwb3J0ZWQgZnJvbSBKYW51YXJ5IDIwMjAgdW50aWwgdGhlIGVuZCBvZiB0aGUgcmVwb3J0aW5nIHdlZWsgaW4gYSBqdXJpc2RpY3Rpb24uIiwKICAgICAgICAgICAgICJUb3RhbCBudW1iZXIgb2YgY2FzZXMgZHVyaW5nIHRoZSByZXBvcnRpbmcgd2VlayBmb3IgYSBqdXJpc2RpY3Rpb24sIG1pbnVzIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FzZXMgZnJvbSB0aGF0IGp1cmlzZGljdGlvbidzIHByZXZpb3VzIHdlZWsncyB1cGRhdGUuIiwKICAgICAgICAgICAgICJUaGUgdG90YWwgbnVtYmVyIG9mIGRlYXRocyByZXBvcnRlZCBmcm9tIEphbnVhcnkgMjAyMCB1bnRpbCB0aGUgZW5kIG9mIHRoZSByZXBvcnRpbmcgd2VlayBpbiBhIGp1cmlzZGljdGlvbi4iLAogICAgICAgICAgICAgIlRvdGFsIG51bWJlciBvZiBkZWF0aHMgZm9yIGEganVyaXNkaWN0aW9uLCBtaW51cyB0aGUgdG90YWwgbnVtYmVyIG9mIGRlYXRocyBmcm9tIHRoYXQganVyaXNkaWN0aW9uJ3MgcHJldmlvdXMgd2VlaydzIHVwZGF0ZS4iCiAgICAgICAgICAgICAKICAgICAgICAgICApCikKQ292aWRERCU+JQogIGd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMi4xLjE6IENPVklELTE5IENhc2VzIGFuZCBEZWF0aCBEYXRhIERpY3Rpb25hcnkiKQoKYGBgCkZyb20gdGhlIFRhYmxlIDIuMS4xLCB3ZSBmb3VuZCB0aGF0IHRoZSBwZXJjZW50YWdlIG9mIG1pc3NpbmcgdmFsdWUgaW4gd2Vla2x5IGNhc2VzIGFuZCBkZWF0aCBjb3VudHMgYXJlIGFib3VuZCAxMCUsIHdoaWNoIGlzIG5vdCBnb29kIGZvciBvdXIgcmVzZWFyY2guIE1pc3NpbmcgdmFsdWVzIGFyZSBtYWlubHkgZm91bmQgaW4gdGhlIG5vcnRoZXJuIGFuZCBzb3V0aGVhc3Rlcm4gcHJvdmluY2VzIGFuZCB0ZXJyaXRvcmllcywgc3VjaCBhcyBOdW5hdnV0IGFuZCBOb3ZhIFNjb3RpYS4gSW4gb3JkZXIgdG8gYXZvaWQgdGhlIGltcGFjdCBvZiBtaXNzaW5nIHZhbHVlcyBvbiB0aGUgc3R1ZHksIHdlIHVzZSB0aGUgdG90YWwgZGVhdGggYW5kIGluZmVjdGlvbnMgb2YgQ09WSUQtMTkgaW4gQ2FuYWRhIGluc3RlYWQgb2YgZXZlcnkgcHJvdmluY2UgYW5kIHRlcnJvdG9yeSBpbiB0aGUgZm9sbG93aW5nIGRpc2N1c3Npb24uCgpTZWNvbmQgZGF0YSBzZXQgaXMgdGhlIHByb3Zpc2lvbmFsIHdlZWtseSBkZWF0aCBjb3VudHMsIGJ5IGFnZXMgYW5kIHNleCBmcm9tIDIwMTAgdG8gMjAyMywgcHVibGlzaGVkIGJ5IFN0YXRpc3RpY3MgQ2FuYWRhLiBUaGlzIGRhdGEgc2V0IHJlY29yZCB0aGUgMTQ5NzMwIG9ic2VydmF0aW9ucyBvZiAxNyB2YXJpYWJsZXMgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIG1vbml0b3JpbmcgdGhlIGltcGFjdHMgb2YgbW9ydGFsaXR5IG9mIGV2ZXJ5IHByb3ZpbmNlIGFuZCB0ZXJyaXRvcnkgaW4gQ2FuYWRhLiBXZSBhbHNvIGRlbGV0ZWQgc29tZSB2YXJpYWJsZXMgd2hpY2ggYXJlIGlycmVsZXZhbnQgd2l0aCBvdXIgc3R1ZHkgb3IgY2FuIG5vdCBkZWxpdmVyZWQgdGhlIHVzZWZ1bCBpbmZvcm1hdGlvbiBpbiB0aGlzIGRhdGEgc2V0LiBTdWNoIGFzIHZhcmlhYmxlcyBsaWtlIFNUQVRVUyBhbmQgVEVSTUlOQVRFRCBhcmUgbWlzc2luZyBpbiBhbGwgb2JzZXJ2YXRpb24gaW4gdGhpcyBkYXRhIHNldCBhbmQgdmFyaWFibGVzIERFQ0lNQUxTIGFuZCBVT01fSUQgYXJlIHRoZSBzYW1lIGZvciBhbGwgdmFyaWFibGVzLiBUaGUgZGF0YSBkaWN0aW9uYXJ5IGZvciByZW1haW5pbmcgdmFyaWFibGVzIGlzIHByb3ZpZGVkIGJlbG93LgpgYGB7cn0KI2RhdGEgZGljdGlvbmFyeTpXZWVrbHkgbW9ydGFsaXR5Cm1vcnRhbGl0eTwtV01vcnRhbGl0eSU+JQogIHNlbGVjdChSRUZfREFURSxHRU8sQWdlLmF0LnRpbWUub2YuZGVhdGgsU2V4LENoYXJhY3RlcmlzdGljcyxVT00sVkFMVUUpCmRhdGEuZnJhbWUoCiAgVmFyaWFibGVzPWNvbG5hbWVzKG1vcnRhbGl0eSksICAgCiAgVHlwZT1zYXBwbHkobW9ydGFsaXR5LCBmdW5jdGlvbih4KSBjbGFzcyh4KSksCiAgRXhhbXBsZT1zYXBwbHkobW9ydGFsaXR5LCBmdW5jdGlvbih4KSBwYXN0ZShhcy5jaGFyYWN0ZXIoaGVhZCh1bmlxdWUoeCksMikpLCBjb2xsYXBzZSA9ICIsICIpKSwKICBOdW1iZXIuVW5pcXVlPXNhcHBseShtb3J0YWxpdHksIGZ1bmN0aW9uKHgpIGxlbmd0aCh1bmlxdWUoeCkpKSwKICBQY3RNaXNzaW5nPXNhcHBseShtb3J0YWxpdHksIGZ1bmN0aW9uKHgpIHBhc3RlMChyb3VuZChzdW0oaXMubmEoeCkpL2xlbmd0aCh4KSwgNCkqMTAwLCIlIikpLAogIENvbW1lbnQ9YygiUmVmZXJlbmNlIHBlcmlvZCBmb3IgdGhlIHNlcmllcyBiZWluZyByZWxlYXNlZC4oMjAxMC0yMDIzKSIsCiAgICAgICAgICAgICAiTmFtZSBvZiBkaW1lbnNpb24uIFRoZXJlIGNhbiBiZSB1cCB0byAxMCBkaW1lbnNpb25zIGluIGEgZGF0YSB0YWJsZS4KKGkuZS4gR2VvZ3JhcGh5KSIsCiAgICAgICAgICAgICAiQWdlIGdyb3VvIHdoZW4gZGVhdGggb2NjdXJyZWQiLAogICAgICAgICAgICAgIlNleCAiLAogICAgICAgICAgICAgIk51bWJlciBvZiBkZWF0aHMiLAogICAgICAgICAgICAgIlRoZSB1bml0IG9mIG1lYXN1cmUgYXBwbGllZCB0byBhIG1lbWJlciBnaXZlbiBpbiB0ZXh0LiIsCiAgICAgICAgICAgICAiVG90YWwgbnVtYmVyIG9mIGRlYXRoIHVuZGVyIGNlcnRhaW4gY2hhcmFjdGVyaXN0aWNzIgogICAgICAgICAgICkKKSU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMi4xLjI6IFdlZWtseSBNb3J0YWxpdHkgRGF0YSBEaWN0aW9uYXJ5IikKCgpgYGAKVGhlIHRvdGFsIG51bWJlciBvZiBkZWF0aCBpbiB0aGlzIGRhdGEgc2V0IGV4aXN0IDkuMjUlIG1pc3NpbmcgZGF0YSBpbiByYXcgZGF0YSBzZXQsIHRoZSBtaXNzaW5nIGRhdGEgYXBwZWFycyBpbiBhbGwgZGF0YSBhZnRlciBKdWx5IDE1LCAyMDIzLiBCZWNhdXNlIHdlIG9ubHkgdXNlIHRoZSBkYXRhIGluIENhbmFkYSB3aXRoIGFsbCBhZ2UgZ3JvdXAgYW5kIGJvdGggc2V4ZXMsIHRoZSBtaXNzaW5nIGRhdGEgb25seSBhY2NvdW50ZWQgZm9yIGxlc3MgdGhhbiAxJSBvZiB0aGUgZGF0YSBzZXQgd2UgZmlsdGVyZWQuIFRoZXJlZm9yZSwgd2Ugb3VyIHN0dWR5IGZvY3VzZWQgb24gdGhlIG92ZXJhbGwgdG90YWwgZGVhdGggYWNjb3VudCBhbmQgdGhlIG51bWJlciBvZiBDT1ZJRC0xOSBkZWF0aHMgaW4gQ2FuYWRhIGR1cmluZyB0aGUgcGVyaW9kIEphbnVhcnkgMjAyMiB0byBKdWx5IDIwMjMuCgpJbiBvcmRlciB0byBoYXZlIGJldHRlciB1bmRlcnN0YW5kaW5nIGFib3V0IHRoZSBtb3J0YWxpdHkgaW4gQ2FuYWRhLCB3ZSB2aXN1YWxpemUgdGhlIHdlZWtseSBkZWF0aCBjb3VudHMgZXZlcnkgeWVhciBmb3JtIDIwMTAgdG8gMjAyMyBpbiBGaWd1cmUyLjEuMiwgaXQgaXMgY2xlYXIgdG8gc2VlIHRoYXQgdGhlICB0aGUgbnVtYmVyIG9mIGFubnVhbCBkZWF0aHMgaXMgaW5jcmVhc2luZyBldmVyeSB5ZWFyLiBUaGUgb3ZlcmFsbCB0cmVuZCBmcm9tIDIwMTAgdG8gMjAxOSBpcyBzaW1pbGFyLCB3aXRoIGFuIGdlbmVyYWwgZGVjcmVhc2UgZnJvbSB0aGUgYmVnZ2luZyB0byB0aGUgbWlkZGxlIG9mIHRoZSB5ZWFyIHRoZW4gZm9sbG93ZWQgYnkgYW4gdXB3YXJkIHRyZW5kIHVudGlsIHRoZSB5ZWFyIGVuZC4gSW4gdGhlIG1pZGRsZSBvZiAyMDIwIGFuZCB0aGUgYmVnaW5uaW5nIG9mIDIwMjIsIHRoZXJlIGV4aXN0IHR3byBzaWduaWZpY2FudCBzcGlrZXMgb24gdGhlIGZpZ3VyZS4gVGhlc2UgcHJvbm91bmNlZCBpbmNyZWFzZXMgaW4gY2FzZSBjb3VudHMgcmFpc2UgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhleSBtYXkgYmUgYXR0cmlidXRlZCB0byBkaXN0aW5jdCBvdXRicmVha3Mgb2YgdGhlIGVwaWRlbWljLiAKCmBgYHtyfQojdml6dWFsaXplIHRoZSBkZWF0aCB3aXRoIGFuZCB3aXRob3V0IGNvdmlkCldNb3J0YWxpdHklPiUKICBtdXRhdGUoWWVhcj15ZWFyKFJFRl9EQVRFKSxXZWVrPXN1YnN0cihSRUZfREFURSw2LDEwKSklPiUKICBtdXRhdGUoWWVhcj1mYWN0b3IoWWVhcikpJT4lCiAgZmlsdGVyKEFnZS5hdC50aW1lLm9mLmRlYXRoPT0iQWdlIGF0IHRpbWUgb2YgZGVhdGgsIGFsbCBhZ2VzIiAmIFNleD09IkJvdGggc2V4ZXMiICYgR0VPPT0iQ2FuYWRhLCBwbGFjZSBvZiBvY2N1cnJlbmNlIiklPiUKICBwbG90X2x5KHg9fldlZWssIHk9flZBTFVFLCBjb2xvcj1+WWVhcix0eXBlID0gInNjYXR0ZXIiLCBtb2RlPSJsaW5lcyIpJT4lCiAgbGF5b3V0KHdpZHRoID0gOTAwLCBoZWlnaHQgPSA1MDAsdGl0bGUgPSAnRmlndXJlMi4xLjI6V2Vla2x5IERlYXRoIENvdW50cycsIHlheGlzID0gbGlzdCh0aXRsZSA9ICJOdW1iZXIgb2YgRGVhdGgiKSkKYGBgCgpgYGB7cn0KV2l0aG91dGM8LVdNb3J0YWxpdHklPiUKICBtdXRhdGUoWWVhcj15ZWFyKFJFRl9EQVRFKSxXZWVrPXN1YnN0cihSRUZfREFURSw2LDEwKSklPiUKICBmaWx0ZXIoQWdlLmF0LnRpbWUub2YuZGVhdGg9PSJBZ2UgYXQgdGltZSBvZiBkZWF0aCwgYWxsIGFnZXMiICYgU2V4PT0iQm90aCBzZXhlcyIgJiBHRU89PSJDYW5hZGEsIHBsYWNlIG9mIG9jY3VycmVuY2UiLFllYXI+PSIyMDIwIiklPiUKICBzZWxlY3QoUkVGX0RBVEUsWWVhciwgV2VlaywgR0VPLENoYXJhY3RlcmlzdGljcyxWQUxVRSklPiUKICBuYS5vbWl0KCkKIFdpdGhvdXRjPC1XaXRob3V0Y1stYygxOjQpLF0KQ088LUNvdmlkJT4lCiAgZmlsdGVyKHBybmFtZT09IkNhbmFkYSIpJT4lCiAgc2VsZWN0KGRhdGUsbnVtZGVhdGhzX2xhc3Q3KQogIGNvbG5hbWVzKENPKVsxXSA8LSAiUkVGX0RBVEUiCgpXT01vcnRhbGl0eTwtV01vcnRhbGl0eSU+JQogIG11dGF0ZShZZWFyPXllYXIoUkVGX0RBVEUpLFdlZWs9c3Vic3RyKFJFRl9EQVRFLDYsMTApKSU+JQogIGZpbHRlcihBZ2UuYXQudGltZS5vZi5kZWF0aD09IkFnZSBhdCB0aW1lIG9mIGRlYXRoLCBhbGwgYWdlcyIgJiBTZXg9PSJCb3RoIHNleGVzIiAmIEdFTz09IkNhbmFkYSwgcGxhY2Ugb2Ygb2NjdXJyZW5jZSIpJT4lCiAgc2VsZWN0KFJFRl9EQVRFLFllYXIsIFdlZWssIEdFTyxDaGFyYWN0ZXJpc3RpY3MsVkFMVUUpCiBXT01vcnRhbGl0eTwtIG1lcmdlKFdPTW9ydGFsaXR5LENPLGJ5PSJSRUZfREFURSIsYWxsPVRSVUUpCiBXT01vcnRhbGl0eTwtIFdPTW9ydGFsaXR5Wy1jKDcwNzo3MjEpLF0KIFdPTW9ydGFsaXR5JG51bWRlYXRoc19sYXN0N1tpcy5uYSggV09Nb3J0YWxpdHkkbnVtZGVhdGhzX2xhc3Q3KV0gPSAwCldPTW9ydGFsaXR5JT4lCiAgbXV0YXRlKERlYXRoX3dpdGhvdXRfY292aWQ9VkFMVUUtbnVtZGVhdGhzX2xhc3Q3KSU+JQogIHBsb3RfbHkoIHg9fldlZWssIHk9fkRlYXRoX3dpdGhvdXRfY292aWQsIGNvbG9yPX5mYWN0b3IoWWVhciksdHlwZSA9ICJzY2F0dGVyIiwgbW9kZT0ibGluZXMiKSU+JQpsYXlvdXQod2lkdGggPSA5MDAsIGhlaWdodCA9IDUwMCwgdGl0bGUgPSAnRmlndXJlMi4xLjM6V2Vla2x5IERlYXRoIENvdW50cyB3aXRob3V0IENPSVZEIGNhc2VzJyx5YXhpcyA9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIERlYXRoIHdpdGhvdXQgQ09WSUQiKSkKYGBgClRvIHZlcmlmeSB0aGlzIGNvbmplY3R1cmUsIHdlIHNob3dlZCB0aGUgd2Vla2x5IG51bWJlciBvZiBkZWF0aCB3aXRob3V0IHRoZSBDT1ZJRC0xOSBjYXNlcyBpbiBGaWd1cmUyLjEuMy4gVGhlIHNwaWtlcyBpbiAyMDIwIGFuZCAyMDIyIGFyZSByZW1vdmVkIGJ1dCB0aGUgc21hbGwgc3Bpa2UgaW4gbWlkLTIwMjEgc3RpbGwgZXhpc3QuIFNvIGRlYXRoIGNvdW50cyByYXBpZCBpbmNyZWFzZSBpbiAyMDIwIGFuZCAyMDIyIG1heSBjYXVzZWQgYnkgQ09WSUQtMTkgYW5kIHdlIHdpbGwgZGlzY3VzcyB0aGUgcHJvYmFiaWxpdHkgb2YgIENPVklELTE5IGRlYXRocyBpbiB0aGUgdG90YWwgbnVtYmVyIG9mIGRlYXRoIGNvbmRpdGlvbiBvbiB5ZWFyIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbi4KCiMjIExvbmctdGVybSBJbXBhY3QKClRoZSBkYXRhIG9mIENPVklELTE5IGxvbmcgdGVybSBzeW1wdG9tIGFtb25nIENhbmFkaWFuIGFkdWx0cyBpcyBmcm9tIHRoZSBDYW5hZGlhbiBDT1ZJRC0xOSBBbnRpYm9keSBhbmQgSGVhbHRoIFN1cnZleSAoQ0NBSFMpIEN5Y2xlMi4gVGhlIHN1cnZleSBjb2xsZWN0ZWQgdGhlIGRhdGEgb3ZlciAzIGNvbGxlY3Rpb24gcGVyaW9kcyBiZXR3ZWVuIEFwcmlsIDIwMjIgYW5kIEF1Z3VzdCAyMDIyLiBUaGUgdGFyZ2V0IHBvcHVsYXRpb24gZm9yIHRoaXMgc3VydmV5IHdhcyBhZHVsdHMgMTggeWVhcnMgb2YgYWdlIGFuZCBvbGRlciBsaXZpbmcgaW4gdGhlIDEwIHByb3ZpbmNlcyBhY3Jvc3MgQ2FuYWRhLiBSZXNwb25kZW50cyB3aG8gcmVwb3J0ZWQgZXhwZXJpZW5jaW5nIHN5bXB0b21zIGF0IGxlYXN0IHRocmVlIG1vbnRocyBhZnRlciBhIHBvc2l0aXZlIENPVklELTE5IHRlc3Qgd2VyZSBjb25zaWRlcmVkIHRvIGhhdmUgbG9uZy10ZXJtIHN5bXB0b21zLltATG9uZ1Rlcm1dIFRoZSBsb25nIHRlcm0gc3ltcHRvbXMgZGF0YSB1c2VkIGluIHRoaXMgc3R1ZHkgaGFzIGJlZW4gcHJlLXByb2Nlc3NlZCBieSBTdGF0aXN0aWNzIENhbmFkYS4gSXQgaXMgZ3JvdXBlZCBieSBzZXggYW5kIGFnZSBncm91cHMuIFRoZSBtZWFzdXJlIGlzIGJpbmFyeSByZXNwb25zZSBmcm9tIHRoZSByZXNwb25kZW50cy4gVGhlIHZhbHVlIHNob3dzIHRoZSBwZXJjZW50YWdlIG9mIHJlc3BvbnNlcyB3aXRoaW4gZWFjaCBzcGVjaWZpYyBncm91cC4gVGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSBwcm92aWRlZCBpbiB0aGUgYXNzZXNzbWVudCBvZiBwb2ludCBlc3RpbWF0ZXMgaW4gY2FzZSBvZiBoaWdoIHZhcmlhYmlsaXR5IGluIHRoZSBkYXRhLiAKClRoZSBkZWZpbml0aW9uIG9mIG1haW4gdmFyaWFibGVzIGluIHRoZSBkYXRhIGlzIHNob3duIGluIGZvbGxvd2luZyBUYWJsZSAyLjIuMS4KCmBgYHtyfQpEYXRhRGljdF9kYXRhIDwtIExvbmdUZXJtWyxjKDEsMiw0LDUsNiw3LDgsMTQsMTgpXQoKRGF0YURpY3Q8LWRhdGEuZnJhbWUoCiAgVmFyaWFibGVzPWNvbG5hbWVzKERhdGFEaWN0X2RhdGEpLCAgIAogIFR5cGU9c2FwcGx5KERhdGFEaWN0X2RhdGEsIGZ1bmN0aW9uKHgpIGNsYXNzKHgpKSwKICBFeGFtcGxlPXNhcHBseShEYXRhRGljdF9kYXRhLCBmdW5jdGlvbih4KSBwYXN0ZShhcy5jaGFyYWN0ZXIoaGVhZCh1bmlxdWUoeCksMikpLCBjb2xsYXBzZSA9ICIsICIpKSwKICBOdW1iZXIuVW5pcXVlPXNhcHBseShEYXRhRGljdF9kYXRhLCBmdW5jdGlvbih4KSBsZW5ndGgodW5pcXVlKHgpKSksCiAgUGN0TWlzc2luZz1zYXBwbHkoRGF0YURpY3RfZGF0YSwgZnVuY3Rpb24oeCkgcGFzdGUwKHJvdW5kKHN1bShpcy5uYSh4KSkvbGVuZ3RoKHgpLCA0KSoxMDAsIiUiKSksCiAgQ29tbWVudD1jKCJSZWZlcmVuY2UgWWVhciAoMjAyMikiLAogICAgICAgICAgICAgICAgICAiR2VvZ3JhcGhpYyBMb2NhdGlvbiAoQ2FuYWRhKSIsCiAgICAgICAgICAgICAgICAgICJEb2VzIHRoZSByZXNwb25kZW50IGhhdmUgdGhlIGxvbmcgdGVybSBzeW1wdG9tcz8gWWVzIG9yIE5vLiIsCiAgICAgICAgICAgICAgICAgICJTZXggQ2F0ZWdvcnkiLAogICAgICAgICAgICAgICAgICAiQWdlIEdyb3VwcyIsCiAgICAgICAgICAgICAgICAgICJDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHZhbHVlLCBlc3RpbWF0ZSBvciBjb25maWRlbmNlIGludGVydmFsIiwKICAgICAgICAgICAgICAgICAgIlVuaXQgb2YgTWVhc3VyZSAoUGVyY2VudGFnZSBvZiB0aGUgZ3JvdXApIiwKICAgICAgICAgICAgICAgICAgIkRhdGEgVmFsdWUiLAogICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIERlY2ltYWwgUGxhY2VzIGluIFZhbHVlIikKKQpEYXRhRGljdCU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMi4yLjE6IExvbmcgVGVybSBTeW1wdG9tcyBEYXRhIERlZmluaXRpb24iKQpgYGAKCkluIHRoZSBzdHVkeSwgd2UgZHJvcHBlZCB2YXJpYWJsZXMgbGlrZSAiUkVGX0RBVEUiLCAiR0VPIiB3aGljaCBjb250YWluIHRoZSBzdXJ2ZXkgaW5mb3JtYXRpb24gYW5kIGFyZSB0aGUgc2FtZSBhY3Jvc3MgdGhlIGVudGlyZSBkYXRhLiBBIGRhdGEgb2YgY3VycmVudCBDT1ZJRC0xOSBjYXNlcyBpbiBDYW5hZGEgW0BDT1ZJRENBU0VfQUddIHdhcyB1c2VkIHRvIGVzdGltYXRlIHRoZSBtaXNzaW5nIHZhcmlhYmxlcyBuZWNlc3NhcnkgZm9yIHRoZSB0ZXN0IHdlIGFwcGxpZWQgaW4gbGF0ZXIgU2VjdGlvbiAzLjIuCgojIyBQcmV2YWxlbmNlIE1vZGVsaW5nCgpXZSB1c2VkIHRoZSBDYW5hZGlhbiBDT1ZJRC0xOSBBbnRpYm9keSBhbmQgSGVhbHRoIFN1cnZleSAoQ0NBSFMpIEN5Y2xlIDEgbWljcm9kYXRhIGluIG1vZGVsaW5nIHRoZSBwcmV2ZWxhbmNlLiBUaGUgQ0NBSFMgaXMgY29sbGVjdGluZyBrZXkgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIHBhbmRlbWljIHRvIGxlYXJuIGFzIG11Y2ggYXMgcG9zc2libGUgYWJvdXQgdGhlIHZpcnVzLCBob3cgaXQgYWZmZWN0cyBvdmVyYWxsIGhlYWx0aCwgaG93IGl0IHNwcmVhZHMsIGFuZCB3aGV0aGVyIENhbmFkaWFucyBhcmUgZGV2ZWxvcGluZyBhbnRpYm9kaWVzIGFnYWluc3QgaXQuIFtAQ0NBSFNdIFRoZSBzdXJ2ZXkgY29udGFpbmVkIHR3byBwYXJ0cywgYW4gZWxlY3Ryb25pYyBxdWVzdGlvbm5haXJlIGFuZCBhbiBhdC1ob21lIGJsb29kIHRlc3QuIFRoZSBxdWVzdGlvbm5haXJlIGFpbWVkIHRvIGdldCBnZW5lcmFsIGhlYWx0aCBhbmQgZXhwb3N1cmUgY29uZGl0aW9ucyBvZiBwYXJ0aWNpcGFudHMsIHdoZXJlYXMgdGhlIGJsb29kIHRlc3Qgd2FzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwcmVzZW5jZSBvZiBDT1ZJRC0xOSBhbnRpYm9kaWVzLgoKVGhlIHN1cnZleSB3YXMgZGVzaWduZWQgYXMgY3Jvc3Mtc2VjdGlvbmFsIGFuZCB3YXMgZ2l2ZW4gdG8gaW5kaXZpZHVhbHMgb3ZlciAxIHllYXJzIG9sZCwgZXhjbHVkaW5nIHRoZSBwb3B1bGF0aW9uIGluIHJlbW90ZSBhcmVhcyBvZiBDYW5hZGEuIFRoZSBkYXRhIHdlcmUgc2FtcGxlZCByYW5kb21seSBmcm9tIDMwIHN0cmF0YSBjcmVhdGVkIGZyb20gZWFjaCBwcm92aW5jZS4gRHVlIHRvIHRoZSB2YXJpb3VzIHNpemUgb2YgdGhlIHBvcHVsYXRpb24gb2YgZWFjaCBzdHJhdHVtLCBTdGF0aXN0aWNzIENhbmFkYSBoYWQgdG8gYWRqdXN0IHRoZSBzYW1wbGUgc2l6ZSBpbiB0aG9zZSBzdHJhdGEgd2l0aCBhIGxhcmdlciBwb3B1bGF0aW9uIGFuZCBoaWdoZXIgcHJvcG9ydGlvbiBvZiBDT1ZJRCBjb25maXJtZWQgY2FzZXMsIGVuc3VyaW5nIGEgcHJlY2lzZSBlc3RpbWF0ZSBvZiB0aGUgcHJldmFsZW5jZS4gSW4gYWRkaXRpb24sIGEgdHdvLXN0YWdlIHNhbXBsaW5nIG1ldGhvZCB3YXMgZG9uZSBhdCB0aGUgaG91c2Vob2xkIGxldmVsLCBmcm9tIHdoaWNoIG9uZSBvZiB0aGUgaG91c2Vob2xkIG1lbWJlcnMgd2FzIHNlbGVjdGVkIGZvciB0aGUgc3VydmV5LiBJbiB0b3RhbCwgYSBzYW1wbGUgc2l6ZSBvZiA0NzkwMCBwZW9wbGUgd2VyZSBzZWxlY3RlZCBhbmQgYWJvdXQgMjMuMCUgcmVzcG9uZGVkIGNvbXBsZXRlbHkgdGhlIHN1cnZleS4KClRoZSByZXN1bHRlZCBkYXRhIGNvbnRhaW5lZCAxMDk3OCBudW1iZXIgb2YgcmVzcG9uc2VzIGFuZCA5OSB2YXJpYWJsZXMuIER1ZSB0byB0aGUgbGFyZ2Ugc2l6ZSBvZiB0aGUgbnVtYmVyIG9mIHZhcmlhYmxlcywgd2Ugb25seSBzZWxlY3RlZCB0aGUgb25lcyB0aGF0IHdlIHdlcmUgbW9zdGx5IGludGVyZXN0ZWQgaW4uIFdlIGJlbGlldmVkIHRoYXQgdGhlIHNlbGVjdGVkIHZhcmlhYmxlcyB3ZXJlIG1vc3QgbGlrZWx5IHNpZ25pZmljYW50IGluIG1vZGVsaW5nIHRoZSBwcmV2YWxlbmNlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGxvb2sgaW50byB0aGUgZGF0YS4gQWZ0ZXIgYWxsLCBhIHZhcmlhYmxlIHNob3dpbmcgaWYgdGhlIHJlc3BvbmRlbnQgaGFkIGEgZmFtaWx5IGRvY3RvciBvciBub3QgbWlnaHQgYmUgbGVzcyBsaWtlbHkgdG8gYWZmZWN0IHRoZSBwcmV2YWxlbmNlIHRoYW4gYSB2YXJpYWJsZSBzaG93aW5nIHRoZSB2YWNjaW5hdGlvbiBzdGF0dXMuIEhvd2V2ZXIsIG9uZSBtdXN0IG5vdGUgdGhhdCB0aGVyZSBtaWdodCBiZSBwcmVkaWN0b3JzIHRoYXQgY291bGQgaW5kaXJlY3RseSBhZmZlY3QgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgb25lIGNvdWxkIGZpbmQgdGhlIHZhcmlhYmxlIHNob3dpbmcgdGhlIHJlc3BvbnNlIHRvIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb246ICJXaGF0IGFyZSB0aGUgcmVhc29ucyB5b3Ugd291bGQgbm90IGdldCB0aGUgQ09WSUQtMTkgdmFjY2luZT8gLSBEbyBub3QgY29uc2lkZXIgaXQgbmVjZXNzYXJ5IHRvIGdldCB0aGUgdmFjY2luZSIuIFRoaXMgdmFyaWFibGUgbWlnaHQgaGF2ZSBpbmZsdWVuY2Ugb24gdGhlIHByZXZhbGVuY2UgYmVjYXVzZSBubyB2YWNjaW5lIHdhcyBnaXZlbiB0byB0aGUgcmVzcG9uZGVudC4gSG93ZXZlciwgd2UgdGhvdWdodCB0aGF0IGl0IHdhcyByYXRoZXIgbGVzcyBpbmZvcm1hdGl2ZSBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiB3YXMgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdmFjY2luYXRpb24gc3RhdHVzLiBUaGVyZWZvcmUsIHdlIG9ubHkgY2hvc2UgdGhvc2UgdmFyaWFibGVzIHRoYXQgY2FuIGhhdmUgYSBkaXJlY3QgaW1wYWN0IG9uIHRoZSBwcmV2YWxlbmNlLiBNb3Jlb3ZlciwgdmFyaWFibGVzIGNvdWxkIGhhdmUgaW52YWxpZCBjYXRlZ29yaWVzIGxpa2UgIlZhbGlkIHNraXAiIG9yICJOb3Qgc3RhdGVkIi4gVGhlc2UgY2F0ZWdvcmllcyB3ZXJlIHByZXNlbnQgZHVlIHRvIHJlZ3VsYXRpb24gYW5kIGxhdyByZWluZm9yY2VtZW50LCBhbmQgdGhlIHN1cnZleSBpcyBkZXNpZ25lZCBlbnRpcmVseSB2b2x1bnRhcnkuIFRoZXJlZm9yZSB0aGVzZSBjYXRlZ29yaWVzIHdlcmUgdHJlYXRlZCBieSB1cyBhcyBtaXNzaW5nIGRhdGEuIEFueSB2YXJpYWJsZSB3aXRoIGEgaGlnaCBwZXJjZW50YWdlIG9mIG1pc3NpbmcgdmFsdWVzICg+MjUlKSB3ZXJlIGRyb3BwZWQuIAoKV2UgZ2F2ZSBhIGRhdGEgZGVmaW5pdGlvbiBpbiBUYWJsZSAyLjMuMSBiZWxvdy4gCgpgYGB7cn0KUmVncmVzc2lvbkRhdGE8LUNDQUhTJT4ldHJhbnNtdXRlKENvdmlkX1N0YXR1cz1jYXNlX3doZW4oQ1NfMzU9PTEgfiAiWWVzIiwgQ1NfMzU9PTIgfiAiTm8iLCAuZGVmYXVsdCA9IE5BKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9uaWM9Y2FzZV93aGVuKENIUkdOVU09PTAgfiAiTm8iLCBDSFJHTlVNPT05IH4gTkEsIC5kZWZhdWx0ID0gIlllcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0Q29udGFjdD1jYXNlX3doZW4oUkFfMTA9PTIgfiAiWWVzIiwgUkFfMTA9PTkgfiBOQSwgLmRlZmF1bHQgPSAiTm8iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtb2tlPWNhc2Vfd2hlbihSQV8zNT09MSB+ICJZZXMiLCBSQV8zNT09MiB+ICJObyIsIC5kZWZhdWx0ID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FzaEhhbmQ9Y2FzZV93aGVuKEhCXzIwQT09MX4iQWx3YXlzIixIQl8yMEE9PTJ+Ik9mdGVuIixIQl8yMEE9PTN+Ik9jY2FzaW9uYWxseSIsSEJfMjBBPT00fiJOZXZlciIsLmRlZmF1bHQgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWFyTWFzaz1jYXNlX3doZW4oSEJfMjBCPT0xfiJBbHdheXMiLEhCXzIwQj09Mn4iT2Z0ZW4iLCBIQl8yMEI9PTN+Ik9jY2FzaW9uYWxseSIsIEhCXzIwQj09NH4iTmV2ZXIiLC5kZWZhdWx0ID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2VlcDJtPWNhc2Vfd2hlbihIQl8yMEQ9PTF+IkFsd2F5cyIsSEJfMjBEPT0yfiJPZnRlbiIsIEhCXzIwRD09M34iT2NjYXNpb25hbGx5IiwgSEJfMjBEPT00fiJOZXZlciIsLmRlZmF1bHQgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdm9pZENyb3dkcz1jYXNlX3doZW4oSEJfMjBFPT0xfiJBbHdheXMiLEhCXzIwRT09Mn4iT2Z0ZW4iLCBIQl8yMEU9PTN+Ik9jY2FzaW9uYWxseSIsIEhCXzIwRT09NH4iTmV2ZXIiLC5kZWZhdWx0ID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmx1VmFjPWNhc2Vfd2hlbihGTFVfMDU9PTF+IlllcyIsRkxVXzA1PT0yfiJObyIsLmRlZmF1bHQgPSBOQSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWNjaW5lU3RhdHVzPWNhc2Vfd2hlbihWWEQwNT09MSB+ICJZZXMiLCBWWEQwNT09MiB+ICJObyIsIC5kZWZhdWx0ID0gTkEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4PWNhc2Vfd2hlbihHRFJfMDU9PTl+TkEsIC5kZWZhdWx0ID0gR0RSXzA1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFnZT1jYXNlX3doZW4oQUdFR1JQPT05fk5BLC5kZWZhdWx0ID0gQUdFR1JQKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUhvdXNlPWNhc2Vfd2hlbihISENEVj09OX5OQSwuZGVmYXVsdCA9IEhIQ0RWKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFudGlCb2R5UmVzdWx0PWZhY3RvcihjYXNlX3doZW4oTEFCRENPVkQ9PTF+IlBvc2l0aXZlIixMQUJEQ09WRD09Mn4iTmVnYXRpdmUiLExBQkRDT1ZEPT0zfiJJbmRldGVybWluYXRlIiksIGxldmVscyA9IGMoIk5lZ2F0aXZlIiwgIkluZGV0ZXJtaW5hdGUiLCAiUG9zaXRpdmUiKSkKKSU+JQogIG11dGF0ZShhY3Jvc3MoYyhDb3ZpZF9TdGF0dXMsIGNocm9uaWMsIERpcmVjdENvbnRhY3QsIFNtb2tlLCBGbHVWYWMsIFZhY2NpbmVTdGF0dXMpLCB+ZmFjdG9yKC4sIGxldmVscyA9IGMoIk5vIiwgIlllcyIpKSkpJT4lCiAgbXV0YXRlKGFjcm9zcyhjKFdhc2hIYW5kLCBXZWFyTWFzaywgS2VlcDJtLCBBdm9pZENyb3dkcyksIH5mYWN0b3IoLiwgbGV2ZWxzID0gYygiTmV2ZXIiLCAiT2NjYXNpb25hbGx5IiwiT2Z0ZW4iLCAiQWx3YXlzIikpKSklPiUKICBtdXRhdGUoYWNyb3NzKGMoU2V4LCBBZ2UsIE51bUhvdXNlKSwgZmFjdG9yKSkKIAoKRGF0YURpY3Q8LWRhdGEuZnJhbWUoCiAgVmFyaWFibGVzPWNvbG5hbWVzKFJlZ3Jlc3Npb25EYXRhKSwgICAKICBUeXBlPXNhcHBseShSZWdyZXNzaW9uRGF0YSwgZnVuY3Rpb24oeCkgY2xhc3MoeCkpLAogIEV4YW1wbGU9c2FwcGx5KFJlZ3Jlc3Npb25EYXRhLCBmdW5jdGlvbih4KSBwYXN0ZShhcy5jaGFyYWN0ZXIoaGVhZCh1bmlxdWUoeCksMikpLCBjb2xsYXBzZSA9ICIsICIpKSwKICBOdW1iZXIuVW5pcXVlPXNhcHBseShSZWdyZXNzaW9uRGF0YSwgZnVuY3Rpb24oeCkgbGVuZ3RoKHVuaXF1ZSh4KSkpLAogIFBjdE1pc3Npbmc9c2FwcGx5KFJlZ3Jlc3Npb25EYXRhLCBmdW5jdGlvbih4KSBwYXN0ZTAocm91bmQoc3VtKGlzLm5hKHgpKS9sZW5ndGgoeCksIDQpKjEwMCwiJSIpKSwKICBDb21tZW50PWMoIkhhZCB0aGUgcmVzcG9uZGVudCBldmVyIGhhZCBhIHBvc2l0aXZlIHRlc3QgcmVzdWx0PyIsCiAgICAgICAgICAgICAgICAgICJIYWQgdGhlIHJlc3BvbmRlbnQgcmVwb3J0ZWQgaGF2aW5nIGNocm9uaWMgY29uZGl0aW9uPyIsCiAgICAgICAgICAgICAgICAgICJJbiB0aGUgbGFzdCBzaXggbW9udGhzLCBoYWQgdGhlIHJlc3BvbmRlbnQgd29ya2VkIGluIGRpcmVjdCBjb250YWN0IHdpdGggcGVvcGxlPyIsCiAgICAgICAgICAgICAgICAgICJEb2VzIHRoZSByZXNwb25kZW50IGN1cnJlbnRseSBzbW9rZSB0b2JhY2NvPyIsCiAgICAgICAgICAgICAgICAgICJXYXNoIGhhbmRzIG9mdGVuPyIsCiAgICAgICAgICAgICAgICAgICJXZWFyIGEgbWFzayBpbiBpbmRvb3IgcHVibGljIHNwYWNlcyB3aGVyZSBwaHlzaWNhbCBkaXN0YW5jaW5nIGlzIGRpZmZpY3VsdCBvciBhIG1hbmRhdG9yeSBtYXNrIGJ5LWxhdyBleGlzdHM/IiwKICAgICAgICAgICAgICAgICAgIktlZXAgYSAyIG1ldGVyIG9yIDYgZm9vdCBkaXN0YW5jZSBmcm9tIG90aGVycz8iLAogICAgICAgICAgICAgICAgICAiQXZvaWQgY3Jvd2RzIGFuZCBsYXJnZSBnYXRoZXJpbmdzPyIsCiAgICAgICAgICAgICAgICAgICJJbiB0aGUgcGFzdCAxMiBtb250aHMsIGhhdmUgeW91IGhhZCBhIHNlYXNvbmFsIGZsdSB2YWNjaW5lPyIsCiAgICAgICAgICAgICAgICAgICJSZWNlaXZlZCBhdCBsZWFzdCBvbmUgdmFjY2luZSBkb3NlIGFnYWluc3QgQ09WSUQtMTk/IiwKICAgICAgICAgICAgICAgICAgIlNleDogMSAtIE1hbGUsIDIgLSBGZW1hbGUiLAogICAgICAgICAgICAgICAgICAiQWdlIGdyb3VwOiAxLTE5LCAyMC0zOSwgNDAtNTksIDYwIGFuZCBvbGRlciIsCiAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgcGVvcGxlIGxpdmluZyBpbiBob3VzZWhvbGQ6IDEsIDIsIDMsIGFuZCA0IG9yIG1vcmUiLAogICAgICAgICAgICAgICAgICAiVGhlIG92ZXJhbGwgaW50ZXJwcmV0YXRpb24gb2YgdGhlIGxhYm9yYXRvcnkgcmVzdWx0IGlzIHRoYXQgaWYgMCBvZiAzIGFudGlnZW4gdGVzdHMgd2FzIHBvc2l0aXZlLCB0aGUgcmVzcG9uZGVudCBoYWQgYW4gb3ZlcmFsbCBuZWdhdGl2ZSB0ZXN0IGZvciBhbnRpYm9kaWVzIGFnYWluc3QgU0FSUy1Db1YtMiwgaWYgMSBvZiAzIGFudGlnZW4gdGVzdHMgd2FzIHBvc2l0aXZlLCB0aGUgcmVzcG9uZGVudCBoYWQgYW4gb3ZlcmFsbCBpbmRldGVybWluYXRlIHRlc3QgZm9yIGFudGlib2RpZXMgYWdhaW5zdCBTQVJTLUNvVi0yLCBhbmQgaWYgMiBvciBtb3JlIG9mIDMgYW50aWdlbiB0ZXN0cyB3ZXJlIHBvc2l0aXZlLCB0aGUgcmVzcG9uZGVudCBoYWQgYW4gb3ZlcmFsbCBwb3NpdGl2ZSB0ZXN0IGZvciBhbnRpYm9kaWVzIGFnYWluc3QgU0FSUy1Db1YtMi4iKQopCkRhdGFEaWN0JT4lZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUYWJsZSAyLjMuMTogQ09WSUQgU3RhdHVzIERhdGEgRGVmaW5pdGlvbiIpCmBgYAoKVG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHJlc3BvbnNlIHZhcmlhYmxlIENvdmlkX1N0YXR1cyB3aXRoIG90aGVyIHByZWRpY3RvcnMsIHdlIGZpdHRlZCBsb2dpc3RpYyBtb2RlbHMgaW4gU2VjdGlvbiAzLjMgYW5kIHByb3ZpZGVkIGFkZGl0aW9uYWwgaW5mZXJlbmNlcy4gCgojIFJlc3VsdAoKCiMjIE1vcnRhbGl0eQpJbiBvcmRlciB0byBkaXNjdXNzIHRoZSBwcm9iYWJpbGl0eSBvZiBDT1ZJRC0xOSBkZWF0aCBpbiB0aGUgdG90YWwgZGVhdGgsIHdlIGZpcnN0IGNhbGN1bGF0ZWQgdGhlIHByb3BvcnRpb24gZm9yIHRoZSBDT1ZJRC0xOSBkZWF0aCBmcm9tIDIwMjAgdG8gMjAyMyBpbiBUYWJsZSAzLjEuMS4gVG8gb3VyIHN1cnByaXNlLCB0aGUgcHJvcG9ydGlvbiBpbiAyMDIyIGlzIHRoZSBoaWdoZXIgdGhhbiB0aGUgcHJvcG9ydGlvbiBpbiAyMDIwLCAwLjA1NzQgYW5kIDAuMDQ5MCByZXNwZWN0aXZlbHkuIFRoaXMgbWlnaHQgYmVjYXVzZSB0aGUgb3V0YnJlYWsgb2YgdGhlIG5ldyB2YXJpYW50IE9taWNyb24uIFRoZSBwcm9wb3J0aW9uIGluIDIwMjEgYW5kIDIwMjMgYXJlIHJlbGF0aXZlbHkgbG93IG1pZ2h0IGJlY2F1c2UgdGhlIHBvcHVsYXRpb24gb2YgdmFjY2luYXRpb24gaW5jcmVhc2UuCmBgYHtyfQojQ29udGluZ2VuY3kgdGFibGUgZm9yIG1vcnRhbGl0eSByYXRlIFZTIHllYXIoT2RkcyBSYXRpbykKdGRlYXRoPC1XT01vcnRhbGl0eSU+JQogIGZpbHRlciggWWVhcj49IjIwMjAiKSU+JQogIGdyb3VwX2J5KFllYXIpJT4lCiAgc3VtbWFyaXNlKFRvdGFsRGVhdGg9c3VtKFZBTFVFKSxUb3RhbGNvdmlkZGVhdGg9c3VtKG51bWRlYXRoc19sYXN0NyksIENEcmF0ZT1Ub3RhbGNvdmlkZGVhdGgvVG90YWxEZWF0aCkKWT1yb3VuZCh0ZGVhdGgkQ0RyYXRlLDQpCnRibDwtZGF0YS5mcmFtZShjYmluZChjKDIwMjAsMjAyMSwyMDIyLDIwMjMpLFksMS1ZKSkKY29sbmFtZXModGJsKTwtYygiWWVhciIsIkNvdmlkIERlYXRoIiwgIk5vdCBDb3ZpZCBEZWF0aCIpCnRibCU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMy4xLjE6IENvbnRpbmdlbmN5IHRhYmxlIGZvciBwcm9wb3J0aW9uIG9mIENPVklELTE5IGRlYXRoIikKYGBgCgpUbyB0ZXN0IHRoZSBob21vZ2VuZWl0eSBmb3IgQ09WSUQtMTkgZGVhdGggcHJvYmFiaWxpdHkgY29uZGl0aW9uIG9uIHllYXJzLCB3ZSBjYW4gdXNlIHRoZSBDaGktc3F1YXJlIHRlc3QgYW5kIHRoZSBudWxsIGFuZCBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIG9mIGhvbW9nZW5laXR5IGNvcnJlc3BvbmRpbmcgdG86ClxiZWdpbntnYXRoZXIqfQpIXzA6UF97anxpfVwgPVwgUF97wrdqfVxcCkhfMTpQX3tqfGl9XG5lcSBQX3vCt2p9ClxlbmR7Z2F0aGVyKn0KCmBgYHtyfQojIHRhYmxlKGNoaS1zcXVhcmUpIHRlc3QgaG9tb2dlbmVpdHkgCllDPXRkZWF0aCRUb3RhbGNvdmlkZGVhdGgKTkM9dGRlYXRoJFRvdGFsRGVhdGgtdGRlYXRoJFRvdGFsY292aWRkZWF0aApudGJsPC1kYXRhLmZyYW1lKGNiaW5kKFlDLE5DKSkKY29sbmFtZXMobnRibCk8LWMoIkNvdmlkIiwgIk5vdCBDb3ZpZCIpCm50YmxzPSBjYmluZChjKCIyMDIwIiwiMjAyMSIsIjIwMjIiLCIyMDIzIiksbnRibCkKICBjb2xuYW1lcyhudGJscyk8LWMoIlllYXIiLCJDb3ZpZCIsICJOb3QgQ292aWQiKQojbnRibHMlPiUKICAjZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICAjdGl0bGUgPSAiVGFibGUgMy4xLjE6IENvbnRpbmdlbmN5IHRhYmxlIGZvciBkZWF0aCBjb3VudHMiKQpjaGlfc3F1YXJlPC1jKGNoaXNxLnRlc3QobnRibCkkc3RhdGlzdGljICxHVGVzdChudGJsKSRzdGF0aXN0aWMpCnBfdmFsdWU8LWMoY2hpc3EudGVzdChudGJsKSRwLnZhbHVlLEdUZXN0KG50YmwpJHAudmFsdWUpCnRlc3Q8LWMoIkNoaS1zcXVhdGVkIHRlc3QiLCJMaWtlbGlob29kIHJhdGlvIHRlc3QiKQogIENoaTwtZGF0YS5mcmFtZSh0ZXN0LGNoaV9zcXVhcmUscF92YWx1ZSkKc2lnbmlmaWNhbmNlX2xldmVsIDwtIDAuMDUKQ2hpJT4lCiAgIGd0KCkgJT4lCiAgdGFiX2hlYWRlcigKICAgIHRpdGxlID0gIlRhYmxlMy4xLjM6UmVzdWx0IGZvciB0ZXN0IGhvbW9nZW5laXR5IGJldHdlZW4gQ09WSUQtMTkgZGVhdGggYW5kIFllYXIiCiAgKSAlPiUKICAgY29sc19sYWJlbCgKICAgY2hpX3NxdWFyZSA9ICJDaGktU3F1YXJlZCBTdGF0aXN0aWMiLAogICAgcF92YWx1ZSA9ICJQLVZhbHVlIiwKICAgIHRlc3Q9IlRlc3QiCiAgKSAlPiUKICBmbXQoCiAgICBjb2x1bW5zID0gdmFycyhwX3ZhbHVlKSwKICAgIGZucyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgaWZlbHNlKHggPCBzaWduaWZpY2FuY2VfbGV2ZWwsIHBhc3RlKCI8Iiwgc2lnbmlmaWNhbmNlX2xldmVsKSwgc3ByaW50ZigiJS4zZiIsIHgpKQogICAgfQogICkKYGBgClRoZSBDaGktc3F1YXJlcyBzdGF0aXN0aWNzIGNvbXB1dGVkIGJ5IENoaS1zcXVhcmVkIHRlc3QgYW5kIExpa2VsaWhvb2QgcmF0aW8gdGVzdCBpcyBkaWZmZXJlbnQgYnV0IHRoZSBwLXZhbHVlIGlzIGxlc3MgdGhhbiAwLjA1IGluIGJvdGggdGVzdC4gVGh1cyB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB1bmRlciB0aGUgMC4wNSBsZXZlbCBzaW5jZSB0aGVyZSBoYXZlICBzdHJvbmcgZXZpZGVuY2UgdGhhdCBleGlzdCBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHByb2JhYmlsaXR5IGluIENPVklELTE5IGRlYXRoIHByb2JhYmlsaXR5IGNvbmRpdGlvbiBvbiB5ZWFycy4KClRoZW4gd2UgY2FuIGNvbXB1dGUgdGhlIHJlbGF0aXZlIHJpc2sgYW5kIG9kZHMgcmF0aW8gZm9yIHllYXJzIHRvIG1lYXN1cmUgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4geWVhcnMgYW5kIENPVklELTE5IGRlYXRoIHByb3BvcnRpb24uIFdlIGNob3NlIHRoZSBDT1ZJRC0xOSBkZWF0aCBwcm9wb3J0aW9uIGluIDIwMjAgeWVhciBhcyBiYXNlbGluZSBjYXRlZ29yeSBhbmQgY29tcHV0ZSB0aGUgcmVsYXRpdmUgcmlza3MgYW5kIG9kZHMgcmF0aW9zLgoKYGBge3J9CiNSZWxhdGl2ZSBSaXNrClRibDwtYXMubWF0cml4KHRibFssYygyLDMpXSkKUlIyMT1yb3VuZChUYmxbMiwxXS9UYmxbMSwxXSw0KQpSUjIyPXJvdW5kKFRibFszLDFdL1RibFsxLDFdLDQpClJSMjM9cm91bmQoVGJsWzQsMV0vVGJsWzEsMV0sNCkKUlJ0Ymw8LWRhdGEuZnJhbWUoIlJlbGF0aXZlIHJpc2siLFJSMjEsUlIyMixSUjIzKQpjb2xuYW1lcyhSUnRibCk8LWMoIlllYXIiLCAiMjAyMSIsICIyMDIyIiwiMjAyMyIpClJSdGJsJT4lZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUYWJsZSAzLjEuNDogUmVsYXRpdmUgcmlza3MgZm9yIHRocmVlIHllYXJzIikKYGBgClRhYmxlIDMuMS40IHNob3dlZCB0aGUgUmVsYXRpdmUgcmlza3MgaW4gMjAyMSwyMDIyIGFuZCAyMDIzLiBXZSBjYW4gc2VlIHRoYXQgcmVsYXRpdmUgcmlza3MgaW4gMjAyMSxhbmQgMjAyMyBhcmUgbGVzcyB0aGFuIDEsIHdlIGNhbiBjb25jbHVkZWQgdGhhdCBpZiBhIHBlb3BsZSBkaWVkIGluIENPVklELTE5LCB0aGlzIHBlb3BsZSBpcyBtb3JlIGxpa2VseSBkaWVkIGluIDIwMjAgdGhhbiAyMDIxIGFuZCAyMDIzLiBUaGUgcmVsYXRpdmUgcmlzayBpbiAyMDIyIGFyZSBncmVhdGVyIHRoYW4gMSwgd2UgY2FuIGNvbmNsdWRlZCB0aGF0IGlmIGEgcGVvcGxlIGRpZWQgaW4gQ09WSUQtMTksIHRoaXMgcGVvcGxlIGlzIG1vcmUgbGlrZWx5IGRpZWQgaW4gMjAyMiB0aGFuIDIwMjAuCgpgYGB7cn0KI09kZHMgcmF0aW9zClRibDwtYXMubWF0cml4KHRibFssYygyLDMpXSkKT1IyMT1yb3VuZChUYmxbMSwxXSpUYmxbMiwyXS8oVGJsWzEsMl0qVGJsWzIsMV0pLDQpCk9SMjI9cm91bmQoVGJsWzEsMV0qVGJsWzMsMl0vKFRibFsxLDJdKlRibFszLDFdKSw0KQpPUjIzPXJvdW5kKFRibFsxLDFdKlRibFs0LDJdLyhUYmxbMSwyXSpUYmxbNCwxXSksNCkKT1J0Ymw8LWRhdGEuZnJhbWUoIk9kZHMgUmF0aW8iLE9SMjEsT1IyMixPUjIzKQpjb2xuYW1lcyhPUnRibCk8LWMoIlllYXIiLCAiMjAyMSIsICIyMDIyIiwiMjAyMyIpCk9SdGJsJT4lZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUYWJsZSAzLjEuNTogT2RkcyByYXRpbyBmb3IgdGhyZWUgeWVhcnMiKQpgYGAKRnJvbSBUYWJsZSAzLjEuNSwgd2UgY2FuIHNlZSB0aGF0IHRoZSBvZGRzIHJhdGlvcyBmb3IgYWxsIHRocmVlIHllYXJzIGFyZSBub3QgZXF1YWwgdG8gMSwgd2hpY2ggaW5kaWNhdGVkIHRoYXQgdGhlcmUgZXhpc3RzIGFzc29jaWF0aW9uIGJldHdlZW4geWVhciBhbmQgQ09WSUQtMTkgZGVhdGggcHJvcG9ydGlvbi4gRm9yIG9kZHMgcmF0aW9zIGluIDIwMjEgYW5kIDIwMjMsIHRoZXJlIGV4aXN0IHBvc2l0aXZlIGFzc29jaWF0aW9uIGJldHdlZW4gcHJvYmFiaWxpdHkgb2YgZGVhdGggY2F1c2VkIGJ5IENPVklELTE5LiBUaGUgYXNzb2NpYXRpb24gaW4gMjAyMiBpcyBuZWdhdGl2ZSBiZXR3ZWVuIHByb3BvcnRpb24gb2YgQ09WSUQtMTkgZGVhdGggaW4gdG90YWwgZGVhdGguICAgCgojIyBMb25nLXRlcm0gSW1wYWN0CgpBcyB0aGUgZGF0YSBvZiBDT1ZJRC0xOSBsb25nIHRlcm0gc3ltcHRvbSBhbW9uZyBDYW5hZGlhbiBhZHVsdHMgZGlkIG5vdCBjb250YWluIHRoZSBwb3B1bGF0aW9uIHNpemUgYW5kIHBvcHVsYXRpb24gZm9yIGVhY2ggZ3JvdXBzLiBXZSBlc3RpbWF0ZSB0aGUgY291bnRzIGZyb20gdGhlIGRhdGEgb2YgV2Vla2x5IG51bWJlciBvZiBDT1ZJRC0xOSBjYXNlcyBpbiBDYW5hZGEgYXMgb2YgT2N0b2JlciAyOCwgMjAyMy4gRnJvbSB0aGUgZGF0YSBvZiBvdmVyYWxsIENPVklELTE5IGNhc2VzLCB3ZSBmaXJzdCBncm91cGVkIHRoZSBkYXRhIHRvIHRoZSBzaW1pbGFyIHN0cnVjdHVyZSBhcyBvdXIgTG9uZyBUZXJtIFN5bXB0b20gZGF0YS4gVGhlIGRhdGEgb2Ygb3RoZXIgZ2VuZGVycyB3YXMgZHJvcHBlZCBiZWNhdXNlIHRoYXQgdGhlIGNvdW50IGlzIHRvbyBzbWFsbCBjb21wYXJpbmcgdG8gdGhlIHRvdGFsIHBvcHVsYXRpb24uCmBgYHtyfQojZ3JvdXAgdGhlIGxvbmd0ZXJtIGRhdGEgYW5kIGRyb3AgdmFyaWFibGVzIG5vdCB1c2VkIGluIHRoZSBhbmFseXNpcwpncm91cGVkX2RhdGEgPC0gTG9uZ1Rlcm0gJT4lCiAgZmlsdGVyKENoYXJhY3RlcmlzdGljcyA9PSAnUGVyY2VudCcpICU+JQogIGdyb3VwX2J5KFNleCwgQWdlLmdyb3VwLCBNZWFzdXJlcykgJT4lCiAgc3VtbWFyaXNlKFZBTFVFLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUgCiAgc3ByZWFkKE1lYXN1cmVzLCBWQUxVRSkKCiNjbGVhbiB0aGUgY292aWQgY2FzZXMgZGF0YSBieSBhZ2UgYW5kIGdlbmRlcgpjbGVhbmVkX2RhdGEgPC0gQ292aWRfYUcgJT4lCiAgc2VsZWN0KC1yYXRlX3Blcl8xMDAwMDApICU+JQogIGZpbHRlcihzdGF0dXMgIT0gJ2RlYXRocycsIAogICAgICAgICBhZ2VfZ3JvdXAgIT0gJ2FsbCcsIAogICAgICAgICBnZW5kZXIgIT0gJ2FsbCcsCiAgICAgICAgIGdlbmRlciAhPSAnb3RoZXInKSAlPiUKICBuYS5vbWl0KCkKCiNtYXRjaCB0aGUgYWdlIGdyb3VwcyBjYXRlZ29yaWVzIHdpdGggbG9uZ3Rlcm0KbWFwX2FnZV9ncm91cCA8LSBmdW5jdGlvbihhZ2VfZ3JvdXApIHsKICBjYXNlX3doZW4oCiAgICBhZ2VfZ3JvdXAgJWluJSBjKCIyMCB0byAyOSIsICIzMCB0byAzOSIpIH4gIkFnZXMgMTggdG8gMzQiLAogICAgYWdlX2dyb3VwICVpbiUgYygiNDAgdG8gNDkiKSB+ICJBZ2VzIDM1IHRvIDQ5IiwKICAgIGFnZV9ncm91cCAlaW4lIGMoIjUwIHRvIDU5IiwgIjYwIHRvIDY5IikgfiAiQWdlcyA1MCB0byA2NCIsCiAgICBhZ2VfZ3JvdXAgJWluJSBjKCI3MCB0byA3OSIsICI4MCsiKSB+ICJBZ2VzIDY1IGFuZCBvdmVyIiwKICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfIAogICkKfQoKI21hdGNoIHRoZSBzZXggY2F0ZWdvcmllcwpzdW1tYXJ5X2RhdGEgPC0gY2xlYW5lZF9kYXRhICU+JQogIG11dGF0ZShhZ2VfZ3JvdXAgPSBtYXBfYWdlX2dyb3VwKGFnZV9ncm91cCkpICU+JQogIG11dGF0ZShnZW5kZXIgPSBjYXNlX3doZW4oCiAgICBnZW5kZXIgPT0gJ21hbGUnIH4gJ01hbGVzJywKICAgIGdlbmRlciA9PSAnZmVtYWxlJyB+ICdGZW1hbGVzJywKICAgIFRSVUUgfiBnZW5kZXIKICApKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZV9ncm91cCkpICU+JQogIGdyb3VwX2J5KGdlbmRlcixhZ2VfZ3JvdXApICU+JQogIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCksIC5ncm91cHMgPSAnZHJvcCcpCgojdG90YWwgZm9yIGFnZXMKYWdlc18xOF9hbmRfb3ZlciA8LSBzdW1tYXJ5X2RhdGEgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyKSAlPiUKICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpLCAuZ3JvdXBzID0gJ2Ryb3AnKSAlPiUKICBtdXRhdGUoYWdlX2dyb3VwID0gJ0FnZXMgMTggYW5kIG92ZXInKQoKc3VtbWFyeV9kYXRhIDwtIGJpbmRfcm93cyhzdW1tYXJ5X2RhdGEsIGFnZXNfMThfYW5kX292ZXIpCgojYm90aCBzZXhlcwpib3RoX3NleGVzX2RhdGEgPC0gc3VtbWFyeV9kYXRhICU+JQogIGZpbHRlcihnZW5kZXIgJWluJSBjKCdNYWxlcycsICdGZW1hbGVzJykpICU+JQogIGdyb3VwX2J5KGFnZV9ncm91cCkgJT4lCiAgc3VtbWFyaXNlKGNvdW50ID0gc3VtKGNvdW50KSwgLmdyb3VwcyA9ICdkcm9wJykgJT4lCiAgbXV0YXRlKGdlbmRlciA9ICdCb3RoIHNleGVzJykKCmZpbmFsX3N1bW1hcnlfZGF0YSA8LSByYmluZChzdW1tYXJ5X2RhdGEsIGJvdGhfc2V4ZXNfZGF0YSkKZmluYWxfc3VtbWFyeV9kYXRhIDwtIGZpbmFsX3N1bW1hcnlfZGF0YSAlPiUKICBhcnJhbmdlKGdlbmRlciwgYWdlX2dyb3VwKSAlPiUKICByZW5hbWUoU2V4ID0gZ2VuZGVyLCBBZ2UuZ3JvdXAgPSBhZ2VfZ3JvdXApCgojY29tYmluZSBsb25ndGVybSBwcm9wb3J0aW9uIGRhdGEgd2l0aCB0aGUgZ3JvdXAgY291bnRzCmNvbWJpbmVkX2RhdGEgPC0gbGVmdF9qb2luKGdyb3VwZWRfZGF0YSwgZmluYWxfc3VtbWFyeV9kYXRhLCBieSA9IGMoIlNleCIsICJBZ2UuZ3JvdXAiKSkKYGBgCgpUaGUgZGF0YSBpcyBmaXJzdCBncm91cGVkIGJ5IHNleCB3aGljaCBjb25zaXN0cyBvZiAibWFsZXMiLCAiZmVtYWxlcyIsIGFuZCAiQm90aCBzZXhlcyIuICJCb3RoIHNleGVzIiBncm91cCBjb250YWluIHRoZSBjb21iaW5lZCBkYXRhIGZyb20gYm90aCBtYWxlcyBhbmQgZmVtYWxlcy4gVGhlbiB0aGUgZGF0YSBpcyBmdXJ0aGVyIGdyb3VwZWQgYnkgYWdlIGdyb3Vwcy4gU3ViZ3JvdXAgIkFnZXMgMTggYW5kIG92ZXIiIGhhcyB0aGUgdG90YWwgY291bnQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHNleCBncm91cC4gVGhlIHByb3BvcnRpb24gdGFibGUgd2l0aCB0b3RhbCBjb3VudCBvZiBzdWJncm91cHMgaXMgc2hvd24gaW4gdGhlIFRhYmxlIDMuMi4xIGJlbG93LgpgYGB7cn0KZ3RfdGFibGUgPC0gY29tYmluZWRfZGF0YSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIoCiAgICB0aXRsZSA9IG1kKCIqKlRhYmxlIDMuMi4xOkNvbWJpbmVkIERhdGEgU2hvd2luZyBQcm9wb3J0aW9ucyBhbmQgQ291bnRzIGJ5IFNleCBhbmQgQWdlKioiKQogICkgJT4lCiAgY29sc19sYWJlbCgKICAgIFNleCA9ICJTZXgiLAogICAgYEFnZS5ncm91cGAgPSAiQWdlIEdyb3VwIiwKICAgIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgID0gIlllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tcyAoUGVyY2VudCkiLAogICAgYE5vLCBkaWQgbm90IGhhdmUgbG9uZy10ZXJtIHN5bXB0b21zYCA9ICJObywgZGlkIG5vdCBoYXZlIGxvbmctdGVybSBzeW1wdG9tcyAoUGVyY2VudCkiLAogICAgY291bnQgPSAiQ291bnQiCiAgKSAlPiUKICB0YWJfc3R5bGUoCiAgICBzdHlsZSA9IGxpc3QoCiAgICAgIGNlbGxfYm9yZGVycyhzaWRlcyA9ICJib3R0b20iLCB3ZWlnaHQgPSBweCgyKSkKICAgICksCiAgICBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KAogICAgICByb3dzID0gY29tYmluZWRfZGF0YSRTZXggIT0gZHBseXI6OmxlYWQoY29tYmluZWRfZGF0YSRTZXgpCiAgICApCiAgKSAlPiUKICB0YWJfc3R5bGUoCiAgICBzdHlsZSA9IGxpc3QoCiAgICAgIGNlbGxfZmlsbChjb2xvciA9ICJsaWdodGdyZXkiKSwgCiAgICAgIGNlbGxfdGV4dCh3ZWlnaHQgPSAiYm9sZCIpCiAgICApLAogICAgbG9jYXRpb25zID0gY2VsbHNfY29sdW1uX2xhYmVscyhjb2x1bW5zID0gVFJVRSkKICApICU+JQogIHRhYl9zdHlsZSgKICAgIHN0eWxlID0gY2VsbF90ZXh0KGFsaWduID0gImNlbnRlciIpLCAKICAgIGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IGMoMyw0KSkKICApCgppbnZpc2libGUocHJpbnQoZ3RfdGFibGUpKQpgYGAKRnJvbSB0aGUgVGFibGUgMy4yLjEsIHdlIGZpbmQgdGhhdCBmb3IgZmVtYWxlcywgaGlnaGVyIHByb3BvcnRpb24oMjQuNCUpIG9mIHJlc3BvbmRlbnRzIGZyb20gYWdlIDY1IGFuZCBvdmVyIHJlcG9ydGVkIGxvbmcgdGVybSBzeW1wdG9tcy4gV2hpbGUgbWFsZXMgZnJvbSBhZ2VzIDE4IHRvIDM0IHNob3cgYSBoaWdoZXIgcHJvcG9ydGlvbigxMyUpIHRvIHJlcG9ydCBsb25nIHRlcm0gc3ltcHRvbXMuIE92ZXJhbGwoYm90aCBzZXhlcyksIGhpZ2hlciBwcm9wb3J0aW9uKDE3LjglKSBvZiBhZHVsdHMgZnJvbSBhZ2VzIDY1IGFuZCBvdmVyIHJlcG9ydGVkIGxvbmcgdGVybSBzeW1wdG9tcy4gRm9yIGFsbCBhZ2UgZ3JvdXBzLCAyMC4xJSBvZiBmZW1hbGVzIHJlcG9ydGVkIGxvbmcgdGVybSBzeW1wdG9tcyBjb21wYXJpbmcgdG8gb25seSAxMiUgb2YgbWFsZXMuCgpUbyBzdHVkeSB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhZ2UgZ3JvdXBzIGFuZCB0aGUgbG9uZyB0ZXJtIHN5bXB0b21zLCBBIENoaS1zcXVhcmUgdGVzdCB3YXMgY29uZHVjdGVkIHdpdGhpbiBlYWNoIHNleCBncm91cC4gVGhlIGh5cG90aGVzaXMgb2YgaW5kZXBlbmRlbmNlIGNvcnJlc3BvbmRzIHRvICRIXzA6cF97aWp9PXBfe2lcY2RvdH1wX3tcY2RvdCBqfSwgXGZvcmFsbCBpLGokLiBVbmRlciBlYWNoIHNleCBncm91cCwgYSAkNFx0aW1lczIkIGNvbnRpbmdlbmN5IGlzIGNvbnN0cnVjdGVkLiBXZSBoYXZlIGFnZSBncm91cHMgYXMgdGhlIHJvdyB2YXJpYWJsZSAsIHJlc3BvbnNlIG9mIGxvbmcgdGVybSBzeW1wdG9tcyBhcyB0aGUgY29sdW1uIHZhcmlhYmxlLiBDb3VudHMgZm9yIHNwZWNpZmljIHJlc3BvbnNlcyAiWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zIiBhbmQgIk5vLCBkaWQgbm90IGhhdmUgbG9uZy10ZXJtIHN5bXB0b21zIiBhcmUgZXN0aW1hdGVkIHVzaW5nIHRoZSBjb3JyZXNwb25kaW5nIHByb3BvcnRpb24gYW5kIHRoZSB0b3RhbCBjb3VudHMgb2YgZWFjaCBzdWJncm91cC4gCgpBIHNpbWlsYXIgQ2hpLXNxdWFyZSB0ZXN0IHdhcyBhcHBsaWVkIHRvIHRlc3QgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gc2V4IGFuZCB0aGUgbG9uZyB0ZXJtIHN5bXB0b21zLiBVbmRlciBlYWNoIGFnZSBncm91cCwgYSAkMlx0aW1lczIkIGNvbnRpbmdlbmN5IHRhYmxlIGlzIGNvbnN0cnVjdGVkIHdpdGggc2V4IGFzIHRoZSByb3cgdmFyaWFibGUgYW5kIGxvbmcgdGVybSBzeW1wdG9tcyBhcyB0aGUgY29sdW1uIHZhcmlhYmxlLiAKClRlc3QgcmVzdWx0cyBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4KYGBge3J9CmxpYnJhcnkoYnJvb20pCnBlcmZvcm1fY2hpX3NxdWFyZTEgPC0gZnVuY3Rpb24oZGF0YSkgewogIGZpbHRlcmVkX2RhdGEgPC0gZGF0YSAlPiUgCiAgICBmaWx0ZXIoYEFnZS5ncm91cGAgIT0gIkFnZXMgMTggYW5kIG92ZXIiKQoKICBjb250aW5nZW5jeV90YWJsZSA8LSBmaWx0ZXJlZF9kYXRhICU+JQogICAgc2VsZWN0KGBBZ2UuZ3JvdXBgLCBgWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zYCwgY291bnQpICU+JQogICAgbXV0YXRlKE5vID0gcm91bmQoKDEwMCAtIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgKSAqIGNvdW50IC8gMTAwKSwKICAgICAgICAgICBZZXMgPSByb3VuZChgWWVzLCBoYWQgbG9uZy10ZXJtIHN5bXB0b21zYCAqIGNvdW50IC8gMTAwKSkgJT4lCiAgICBzZWxlY3QoLWBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgLC1gY291bnRgKSAlPiUKICAgIGdyb3VwX2J5KGBBZ2UuZ3JvdXBgKQoKICBjaGlfc3F1YXJlX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlWy0xXSkKICAKICByZXR1cm4oY2hpX3NxdWFyZV9yZXN1bHQpCn0KCnJlc3VsdHMxIDwtIGxpc3QoKQpzZXhlcyA8LSBjKCJNYWxlcyIsICJGZW1hbGVzIiwgIkJvdGggc2V4ZXMiKQpmb3IgKHNleCBpbiBzZXhlcykgewogIGZpbHRlcmVkX2RhdGEgPC0gY29tYmluZWRfZGF0YSAlPiUgZmlsdGVyKFNleCA9PSBzZXgpCiAgcmVzdWx0czFbW3NleF1dIDwtIHBlcmZvcm1fY2hpX3NxdWFyZTEoZmlsdGVyZWRfZGF0YSkKfQoKdGVzdF9yZXN1bHRzMSA8LSBsYXBwbHkocmVzdWx0czEsIHRpZHkpICU+JSBiaW5kX3Jvd3MoKSAlPiUgbXV0YXRlKFNleCA9IHNleGVzKQp0ZXN0X3Jlc3VsdHMxIDwtIHNlbGVjdCh0ZXN0X3Jlc3VsdHMxLCBTZXgsIHN0YXRpc3RpYywgcC52YWx1ZSkKCnNpZ25pZmljYW5jZV9sZXZlbCA8LSAwLjA1CgpyZXN1bHRfdGFibGUxIDwtIHRlc3RfcmVzdWx0czEgJT4lCiAgZ3QoKSAlPiUKICB0YWJfaGVhZGVyKAogICAgdGl0bGUgPSBtZCgiKipUYWJsZSAzLjIuMjogQ2hpLVNxdWFyZWQgVGVzdCBSZXN1bHRzIG9mIEFnZSBncm91cHMgYW5kIExvbmcgdGVybSBzeW1wdG9tcyoqIikKICApICU+JQogIGNvbHNfbGFiZWwoCiAgICBTZXggPSAiU2V4IiwKICAgIHN0YXRpc3RpYyA9ICJDaGktU3F1YXJlZCBTdGF0aXN0aWMiLAogICAgcC52YWx1ZSA9ICJQLVZhbHVlIgogICkgJT4lCiAgZm10X251bWJlcigKICAgIGNvbHVtbnMgPSB2YXJzKHN0YXRpc3RpYywgcC52YWx1ZSksCiAgICBkZWNpbWFscyA9IDMKICApICU+JQogIGZtdCgKICAgIGNvbHVtbnMgPSB2YXJzKHAudmFsdWUpLAogICAgZm5zID0gZnVuY3Rpb24oeCkgewogICAgICBpZmVsc2UoeCA8IHNpZ25pZmljYW5jZV9sZXZlbCwgcGFzdGUoIjwiLCBzaWduaWZpY2FuY2VfbGV2ZWwpLCBzcHJpbnRmKCIlLjNmIiwgeCkpCiAgICB9CiAgKQoKaW52aXNpYmxlKHByaW50KHJlc3VsdF90YWJsZTEpKQpgYGAKVGFibGUgMy4yLjIgc2hvd3MgdGhlIHJlc3VsdHMgb2YgQ2hpLXNxdWFyZWQgdGVzdHMgY29tcGFyaW5nIHRoZSBPY2N1cnJlbmNlIG9mIGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcyBhY3Jvc3MgZGlmZmVyZW50IGFnZSBncm91cHMgd2l0aGluIGVhY2ggc2V4IGNhdGVnb3J5IGFuZCBmb3IgYm90aCBzZXhlcyBjb21iaW5lZC5Gb3IgYWxsIGNhdGVnb3JpZXMgKE1hbGVzLCBGZW1hbGVzLCBhbmQgQm90aCBTZXhlcyksIHRoZSBDaGktc3F1YXJlZCBzdGF0aXN0aWNzIGFyZSBoaWdoLCBhbmQgdGhlIHAtdmFsdWVzIGFyZSBsZXNzIHRoYW4gMC4wNS5UaGlzIHN1Z2dlc3RzIHRoYXQgd2l0aGluIGVhY2ggb2YgdGhlc2UgY2F0ZWdvcmllcywgdGhlcmUgaXMgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGJldHdlZW4gYWdlIGdyb3VwIGFuZCB0aGUgb2NjdXJyZW5jZSBvZiBsb25nLXRlcm0gQ09WSUQtMTkgc3ltcHRvbXMuIFRoZSBkaWZmZXJlbmNlcyBpbiBzeW1wdG9tIGZyZXF1ZW5jaWVzIGFjcm9zcyBhZ2UgZ3JvdXBzIGFyZSBub3QgbGlrZWx5IHRvIGJlIGR1ZSB0byByYW5kb20gY2hhbmNlLgoKYGBge3J9CnBlcmZvcm1fY2hpX3NxdWFyZTIgPC0gZnVuY3Rpb24oZGF0YSwgYWdlX2dyb3VwKSB7CiAgZmlsdGVyZWRfZGF0YSA8LSBkYXRhICU+JQogICAgZmlsdGVyKGBBZ2UuZ3JvdXBgID09IGFnZV9ncm91cCwgU2V4ICE9ICJCb3RoIHNleGVzIikKCiAgY29udGluZ2VuY3lfdGFibGUgPC0gZmlsdGVyZWRfZGF0YSAlPiUKICAgIHNlbGVjdChTZXgsIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgLCBjb3VudCkgJT4lCiAgICBtdXRhdGUoTm8gPSByb3VuZCgoMTAwIC0gYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2ApICogY291bnQgLyAxMDApLAogICAgICAgICAgIFllcyA9IHJvdW5kKGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgICogY291bnQgLyAxMDApKSAlPiUKICAgIHNlbGVjdCgtYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2AsLWBjb3VudGApICU+JQogICAgZ3JvdXBfYnkoU2V4KQoKICBjaGlfc3F1YXJlX3Jlc3VsdCA8LSBjaGlzcS50ZXN0KGNvbnRpbmdlbmN5X3RhYmxlWy0xXSkKCiAgcmV0dXJuKGNoaV9zcXVhcmVfcmVzdWx0KQp9CgphZ2VfZ3JvdXBzIDwtIHVuaXF1ZShjb21iaW5lZF9kYXRhJEFnZS5ncm91cCkKCnJlc3VsdHMyIDwtIGxpc3QoKQpmb3IgKGFnZSBpbiBhZ2VfZ3JvdXBzKSB7CiAgcmVzdWx0czJbW2FnZV1dIDwtIHBlcmZvcm1fY2hpX3NxdWFyZTIoY29tYmluZWRfZGF0YSwgYWdlKQp9Cgp0ZXN0X3Jlc3VsdHMyIDwtIGxhcHBseShyZXN1bHRzMiwgdGlkeSkgJT4lIGJpbmRfcm93cygpICU+JSBtdXRhdGUoYEFnZS5ncm91cGAgPSBhZ2VfZ3JvdXBzKQp0ZXN0X3Jlc3VsdHMyIDwtIHNlbGVjdCh0ZXN0X3Jlc3VsdHMyLCBgQWdlLmdyb3VwYCwgc3RhdGlzdGljLCBwLnZhbHVlKQoKcmVzdWx0X3RhYmxlMiA8LSB0ZXN0X3Jlc3VsdHMyICU+JQogIGd0KCkgJT4lCiAgdGFiX2hlYWRlcigKICAgIHRpdGxlID0gbWQoIioqVGFibGUgMy4yLjM6IENoaS1TcXVhcmVkIFRlc3QgUmVzdWx0cyBvZiBTZXggYW5kIExvbmcgdGVybSBzeW1wdG9tcyoqIikKICApICU+JQogIGNvbHNfbGFiZWwoCiAgICBgQWdlLmdyb3VwYCA9ICJBZ2UgR3JvdXAiLAogICAgc3RhdGlzdGljID0gIkNoaS1TcXVhcmVkIFN0YXRpc3RpYyIsCiAgICBwLnZhbHVlID0gIlAtVmFsdWUiCiAgKSAlPiUKICBmbXRfbnVtYmVyKAogICAgY29sdW1ucyA9IHZhcnMoc3RhdGlzdGljKSwKICAgIGRlY2ltYWxzID0gMwogICkgJT4lCiAgZm10KAogICAgY29sdW1ucyA9IHZhcnMocC52YWx1ZSksCiAgICBmbnMgPSBmdW5jdGlvbih4KSB7CiAgICAgIGlmZWxzZSh4IDwgMC4wNSwgcGFzdGUoIjwgMC4wNSIpLCBzcHJpbnRmKCIlLjNmIiwgeCkpCiAgICB9CiAgKQoKaW52aXNpYmxlKHByaW50KHJlc3VsdF90YWJsZTIpKQpgYGAKVGFibGUgMy4yLjMgcHJlc2VudHMgdGhlIHJlc3VsdHMgb2YgQ2hpLXNxdWFyZWQgdGVzdHMgY29tcGFyaW5nIHRoZSBvY2N1cnJlbmNlIG9mIGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcyBiZXR3ZWVuIG1hbGVzIGFuZCBmZW1hbGVzIHdpdGhpbiBlYWNoIGFnZSBncm91cC5FYWNoIGFnZSBncm91cCBzaG93cyBhIHZlcnkgaGlnaCBDaGktc3F1YXJlZCBzdGF0aXN0aWMgd2l0aCBhbGwgcC12YWx1ZXMgYmVpbmcgbGVzcyB0aGFuIDAuMDUuIFRoZXNlIHJlc3VsdHMgaW5kaWNhdGUgYSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGFzc29jaWF0aW9uIGJldHdlZW4gc2V4IGFuZCB0aGUgb2NjdXJyZW5jZSBvZiBsb25nLXRlcm0gQ09WSUQtMTkgc3ltcHRvbXMgaW4gZWFjaCBhZ2UgZ3JvdXAuCgpUbyBmdXJ0aGVyIGV4cGxvcmUgdGhlIHN0cmVuZ3RoIG9mIHRoZSBhc3NvY2lhdGlvbi4gV2UgY2FsY3VsYXRlZCBvZGRzIHJhdGlvcyBwcmltYXJpbHkgYmV0d2VlbiBtYWxlcyBhbmQgZmVtYWxlcyBpbiBlYWNoIGFnZSBncm91cC4gRm9yIGVhY2ggYWdlIGdyb3VwLCB0aGUgb2RkcyBvZiBmZW1hbGVzIGV4cGVyaWVuY2luZyBsb25nLXRlcm0gc3ltcHRvbXMgYXJlIGNvbXBhcmVkIHRvIHRoZSBvZGRzIGZvciBtYWxlcy4gQW4gT1IgZ3JlYXRlciB0aGFuIDEgaW5kaWNhdGVzIGEgaGlnaGVyIGxpa2VsaWhvb2QgZm9yIGZlbWFsZXMuIFRoZSByZXN1bHRzIGFyZSBzaG93biBpbiBUYWJsZSAzLjIuNC4KYGBge3J9CmNvbnRpbmdlbmN5X3RhYmxlcyA8LSBjb21iaW5lZF9kYXRhICU+JQogICNmaWx0ZXIoYEFnZS5ncm91cGAgIT0gIkFnZXMgMTggYW5kIG92ZXIiKSAlPiUKICBmaWx0ZXIoIFNleCAhPSAiQm90aCBzZXhlcyIpICU+JQogIHNlbGVjdChgU2V4YCwgYEFnZS5ncm91cGAsIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgLCBjb3VudCkgJT4lCiAgbXV0YXRlKE5vID0gcm91bmQoKDEwMCAtIGBZZXMsIGhhZCBsb25nLXRlcm0gc3ltcHRvbXNgKSAqIGNvdW50IC8gMTAwKSwKICAgICAgICAgWWVzID0gcm91bmQoYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2AgKiBjb3VudCAvIDEwMCkpICU+JQogIHNlbGVjdCgtYFllcywgaGFkIGxvbmctdGVybSBzeW1wdG9tc2AsIC1jb3VudCkgJT4lCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKCJZZXMiLCAiTm8iKSwgbmFtZXNfdG8gPSAiUmVzcG9uc2UiLCB2YWx1ZXNfdG8gPSAiQ291bnQiKSAlPiUKICBncm91cF9ieShgQWdlLmdyb3VwYCwgYFNleGAsIFJlc3BvbnNlKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9ICJSZXNwb25zZSIsIHZhbHVlc19mcm9tID0gIkNvdW50IikKCmNvbnRpbmdlbmN5X3RhYmxlcyA8LSBjb250aW5nZW5jeV90YWJsZXMgJT4lCiAgbXV0YXRlKE9kZHMgPSBZZXMgLyBObykKCm9kZHNfcmF0aW9zIDwtIGNvbnRpbmdlbmN5X3RhYmxlcyAlPiUKICBncm91cF9ieShBZ2UuZ3JvdXApICU+JQogIHN1bW1hcmlzZShPZGRzUmF0aW8gPSBPZGRzW1NleCA9PSAiRmVtYWxlcyJdIC8gT2Rkc1tTZXggPT0gIk1hbGVzIl0pICU+JQogIHVuZ3JvdXAoKQoKT1JfdGFibGUgPC0gb2Rkc19yYXRpb3MgJT4lCiAgZ3QoKSAlPiUKICB0YWJfaGVhZGVyKAogICAgdGl0bGUgPSBtZCgiKipUYWJsZSAzLjIuNDogT2RkcyBSYXRpb3Mgb2YgTG9uZy10ZXJtIENPVklELTE5IFN5bXB0b21zOiBGZW1hbGVzIHZzIE1hbGVzIGJ5IEFnZSBHcm91cCoqIikKICApICU+JQogIGNvbHNfbGFiZWwoCiAgICBBZ2UuZ3JvdXAgPSAiQWdlIEdyb3VwIiwKICAgIE9kZHNSYXRpbyA9ICJPZGRzIFJhdGlvIgogICkgJT4lCiAgZm10X251bWJlcigKICAgIGNvbHVtbnMgPSB2YXJzKE9kZHNSYXRpbyksCiAgICBkZWNpbWFscyA9IDMKICApCgppbnZpc2libGUocHJpbnQoT1JfdGFibGUpKQoKYGBgCkFjcm9zcyBhbGwgYWdlIGdyb3VwcywgZmVtYWxlcyBhcmUgY29uc2lzdGVudGx5IG1vcmUgbGlrZWx5IHRoYW4gbWFsZXMgdG8gcmVwb3J0IGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcywgYXMgaW5kaWNhdGVkIGJ5IG9kZHMgcmF0aW9zIGdyZWF0ZXIgdGhhbiAxIGluIGVhY2ggY2F0ZWdvcnkuIFRoZSBvZGRzIHJhdGlvcyBzZWVtIHRvIGluY3JlYXNlIHdpdGggYWdlLiBUaGUgaGlnaGVzdCBkaXNwYXJpdHkgYmV0d2VlbiBmZW1hbGVzIGFuZCBtYWxlcyBpcyBvYnNlcnZlZCBpbiB0aGUgb2xkZXN0IGFnZSBncm91cCAoQWdlcyA2NSBhbmQgb3ZlcikuCgojIyBQcmV2YWxlbmNlIE1vZGVsaW5nCgpUaGUgaHlwb3RoZXNpcyB3ZSB3ZXJlIG1vc3RseSBpbnRlcmVzdGVkIGluIHdhczoKClxiZWdpbntnYXRoZXIqfQpIXzA6IFxiZXRhX2ogPSAwIFxcCkhfMDogXGJldGFfaiBcbmVxIDAKXGVuZHtnYXRoZXIqfQoKZm9yIGVhY2ggY29lZmZpY2llbnQgcmVsYXRlZCB0byBpdHMgY29ycmVzcG9uZGluZyBjb3ZhcmlhdGUuIEluIG90aGVyIHdvcmRzLCB3ZSB3YW50ZWQgdG8gZGVzY3JpYmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDT1ZJRCBzdGF0dXMgb2YgYSBwYXJ0aWNpcGFudCBhbmQgb3RoZXIgcHJlZGljdG9ycy4gV2Ugc2VsZWN0ZWQgdGhlIG1vZGVsIHdpdGggdGhlIGxlYXN0IEFJQyB2YWx1ZSBzaG93biBpbiBUYWJsZSAzLjMuMS4KYGBge3J9Clh5PC1SZWdyZXNzaW9uRGF0YVssMjoxNF0lPiVtdXRhdGUoeT1SZWdyZXNzaW9uRGF0YSRDb3ZpZF9TdGF0dXMpJT4lbmEub21pdCgpCk1vZGVsczwtYmVzdGdsbShYeSxmYW1pbHk9Ymlub21pYWwsSUM9YygiQUlDIikpIApgYGAKCmBgYHtyfQpmaXRzPC10KHJiaW5kKE1vZGVscyRTdWJzZXRzWywxOjE0XSwgbj1jb2xTdW1zKE1vZGVscyRTdWJzZXRzWywxOjE0XSkpKQpmaXRzPC1jYmluZChhcy5kYXRhLmZyYW1lKGZpdHNbb3JkZXIoZml0c1ssIm4iXSwgZGVjcmVhc2luZyA9IFRSVUUpLC0xNV0lPiV0KCkpLCBNb2RlbHMkU3Vic2V0c1ssMTU6MTZdKQoKZml0cyU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMy4zLjE6IENvbXBsZXRlIExpc3Qgb2YgTW9kZWxzIEZvciBDT1ZJRCBTdGF0dXMgRXN0aW1hdGlvbiIpJT4ldGFiX29wdGlvbnMoY29udGFpbmVyLndpZHRoID0gMTQwMCwgdGFibGUuYWxpZ249ImxlZnQiKSU+JQogIHRhYl9zdHlsZShzdHlsZSA9IGxpc3QoY2VsbF9maWxsKGNvbG9yID0gImxpZ2h0Ymx1ZSIpKSwgbG9jYXRpb25zID0gY2VsbHNfYm9keShyb3dzID0gNSkpCmBgYAoKT3VyIGJlc3QgbW9kZWwgaGFkIHRoZSBmb2xsb3dpbmcgY29lZmZpY2llbnRzIHNob3duIGluIHRoZSBzdW1tYXJ5IFRhYmxlIDMuMy4yLCBmcm9tIHdoaWNoIHdlIGZvdW5kIHRoYXQgdGhlIHZhcmlhYmxlIEZsdVZhYyB0aGF0IGluZGljYXRlZCB3aGV0aGVyIG9yIG5vdCB0aGUgcGFydGljaXBhbnQgaGFkIGEgZmx1IHNob3QgZm9yIHRoZSBwYXN0IDEyIG1vbnRocyBoYWQgYSBwLXZhbHVlID0gMC4xNTUgbm90IHNpZ25pZmljYW50IGVub3VnaCwgc28gd2UgZGlkIG5vdCBoYXZlIGEgY29uY2x1c2lvbiBvbiB3aGV0aGVyIHRoZSB2YXJpYWJsZSB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNwb25zZS4KCmBgYHtyfQpNb2RlbHMkQmVzdE1vZGVsJT4lc3RhcmdhemVyKHR5cGUgPSAidGV4dCIsIHRpdGxlPSJUYWJsZSAzLjMuMjogU3VtbWFyeSBvZiBNb2RlbCB3aXRoIExvd2VzdCBBSUMiLCBkZXAudmFyLmxhYmVscyA9IGMoIkNvdmlkXFxfU3RhdHVzIiksIHJlcG9ydD0oInZjKnMqcCIpKQpgYGAKCldlIGxvb2tlZCBhdCB0aGUgQUlDIHdoZW4gdGhlIGZsdSB2YWNjaW5lIHN0YXR1cyB2YXJpYWJsZSB3YXMgcmVtb3ZlZC4gT25lIGNhbiBzZWUgaW4gVGFibGUgMy4zLjMgYmVsb3cgdGhhdCB0aGVyZSB3YXMgbm90IG11Y2ggZGlmZmVyZW5jZSBpbiB0aGUgQUlDIHZhbHVlLiBGb3IgbW9kZWwgc2ltcGxpY2l0eSB3ZSB0aGVyZWZvcmUgb21pdHRlZCB0aGUgdmFyaWFibGUuIAoKYGBge3J9Ck1vZGVscyRCZXN0TW9kZWxzWzE6MixdJT4lZ3QoKSU+JXRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJUYWJsZSAzLjMuMzogTW9kZWwgQUlDIENvbXBhcmlzb24gd2l0aCBGbHVWYWMgUmVtb3ZlZCIpJT4ldGFiX29wdGlvbnMoY29udGFpbmVyLndpZHRoID0gMTQwMCwgdGFibGUuYWxpZ249ImxlZnQiKSU+JQogIHRhYl9zdHlsZShzdHlsZSA9IGxpc3QoY2VsbF9maWxsKGNvbG9yID0gImxpZ2h0Ymx1ZSIpKSwgbG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zPUZsdVZhYykpCmBgYAoKU2ltaWxhcmx5LCBmcm9tIHN1bW1hcnkgVGFibGUgMy4zLjIgYWJvdmUgd2UgZm91bmQgdGhhdCB0aGUgdmFyaWFibGUgRGlyZWN0Q29udGFjdCB0aGF0IHNob3dlZCB3aGV0aGVyIHRoZSBwYXJ0aWNpcGFudCBoYWQgZGlyZWN0ZWQgY29udGFjdCB3aXRoIHBlb3BsZSBvciBub3QgYWxzbyBoYWQgYW4gdW5wcm9taXNpbmcgcC12YWx1ZT0wLjA1My4gQWZ0ZXIgcmVtb3ZpbmcgdGhlIEZsdVZhYyB2YXJpYWJsZSBmaXJzdCwgd2UgY29tcGFyZWQgdGhlIG1vZGVscyB3aXRoIGFuZCB3aXRob3V0IERpcmVjdENvbnRhY3QgdmFyaWFibGUgdXNpbmcgdGhlIGRldmlhbmNlLiBGcm9tIHRoZSBmb2xsb3dpbmcgc3VtbWFyeSBUYWJsZSAzLjMuNCBvbmUgY2FuIHNlZSB0aGF0IHRoZSBwLXZhbHVlIG9mIHRoZSBDaGktc3F1YXJlZCBzdGF0aXN0aWMgd2FzIDAuMDg1LCBzdWdnZXN0aW5nIGFnYWluIHRoYXQgd2UgZGlkIG5vdCBoYXZlIGEgY29uY2x1c2lvbiB3aGV0aGVyIG9yIG5vdCB0aGVyZSB3YXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgQ09WSUQgc3RhdHVzIGFuZCBoYXZpbmcgZGlyZWN0IGNvbnRhY3Qgd2l0aCBwZW9wbGUuCgpgYGB7cn0KZml0MTwtZ2xtKHl+RGlyZWN0Q29udGFjdCtWYWNjaW5lU3RhdHVzK0FudGlCb2R5UmVzdWx0LCBkYXRhPVh5LCBmYW1pbHkgPSAiYmlub21pYWwiKQpmaXQyPC1nbG0oeX5WYWNjaW5lU3RhdHVzK0FudGlCb2R5UmVzdWx0LCBkYXRhPVh5LCBmYW1pbHkgPSAiYmlub21pYWwiKQp0YmxzPC1hbm92YShmaXQxLCBmaXQyLCB0ZXN0PSJMUlQiKQpub3Rlczwtc3Ryc3BsaXQoYXR0cih0YmxzLCAiaGVhZGluZyIpWzJdLCAiXG4iKQp0YmxzJT4lc3RhcmdhemVyKHR5cGUgPSAidGV4dCIsIHRpdGxlPSJUYWJsZSAzLjMuNDogVmFsaWRhdGlvbiBvZiBEaXJlY3RDb250YWN0IFZhcmlhYmxlIixub3Rlcz1ub3Rlc1tbMV1dLHN1bW1hcnk9RkFMU0UpCmBgYAoKV2UgYWdhaW4gZHJvcHBlZCB0aGUgdmFyaWFibGUgRGlyZWN0Q29udGFjdCBiZWNhdXNlIHRoZSBBSUMgZGlkbid0IGNoYW5nZSBzaWduaWZpY2FudGx5IGFmdGVyIHJlbW92YWw6CmBgYHtyfQpNb2RlbHMkU3Vic2V0c1szOjQsXSU+JWd0KCklPiV0YWJfaGVhZGVyKAogICAgdGl0bGUgPSAiVGFibGUgMy4zLjU6IE1vZGVsIEFJQyBDb21wYXJpc29uIHdpdGggRGlyZWN0Q29udGFjdCBSZW1vdmVkIiklPiV0YWJfb3B0aW9ucyhjb250YWluZXIud2lkdGggPSAxNDAwLCB0YWJsZS5hbGlnbj0ibGVmdCIpJT4lCiAgdGFiX3N0eWxlKHN0eWxlID0gbGlzdChjZWxsX2ZpbGwoY29sb3IgPSAibGlnaHRibHVlIikpLCBsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnM9RGlyZWN0Q29udGFjdCkpCmBgYAoKVGhlcmVmb3JlLCB3ZSBjb25jbHVkZWQgdGhhdCBvdXIgbW9kZWwgd2FzOgpcYmVnaW57ZXF1YXRpb24qfQpcbG57KFxmcmFje3BfaX17MS1wX2l9KX0gPSAtNS41NjUgLTQuNTY4IFx0aW1lcyBcdGV4dHtWYWNjaW5lU3RhdHVzWWVzfV9pICszLjM5MiBcdGltZXMgXHRleHR7QW50aUJvZHlSZXN1bHRJbmRldGVybWluYXRlfV9pICs2LjYwMiBcdGltZXMgXHRleHR7QW50aUJvZHlSZXN1bHRQb3NpdGl2ZX1faQpcZW5ke2VxdWF0aW9uKn0KCmZyb20gdGhlIGZvbGxvd2luZyBzdW1tYXJ5IFRhYmxlIDMuMy42OgpgYGB7cn0KZml0MiU+JXN0YXJnYXplcih0eXBlID0gInRleHQiLCB0aXRsZT0iVGFibGUgMy4zLjY6IFN1bW1hcnkgb2YgRmluYWwgTW9kZWwiLCBkZXAudmFyLmxhYmVscyA9IGMoIkNvdmlkXFxfU3RhdHVzIiksIHJlcG9ydD0oInZjKnMqcCIpKQpgYGAKCldlIGZ1cnRoZXIgZGlkIGFub3RoZXIgbW9kZWwgZXN0aW1hdGlvbiBmb3IgdGhlIENPVklEIHN0YXR1cyBhbmQgc29tZSBwcmV2ZW50YXRpdmUgYmVoYXZpb3VycyBsaWtlIHdhc2hpbmcgaGFuZHMsIHdlYXJpbmcgbWFza3MsIGtlZXAgMiBtZXRyZXMgYW5kIGF2b2lkaW5nIGNyb3dkcy4gVGhlIHJlc3VsdCBpbiBzdW1tYXJ5IFRhYmxlIDMuMy43IHNob3dlZCB0aGF0IG9ubHkgd2FzaGluZyBoYW5kcyBvZnRlbiBhbiBhbHdheXMgd2VyZSBzaWduaWZpY2FudCBlbm91Z2ggdG8gYmUgbmVnYXRpdmVseSByZWxhdGVkIHRvIHRoZSBDT1ZJRCBzdGF0dXMgd2hlcmVhcyBhbGwgb3RoZXIgY292YXJpYXRlcyB3ZXJlIGluY29uY2x1c2l2ZS4KCmBgYHtyfQpYeTI8LVJlZ3Jlc3Npb25EYXRhJT4lc2VsZWN0KENvdmlkX1N0YXR1cywgV2FzaEhhbmQsIFdlYXJNYXNrLCBLZWVwMm0sIEF2b2lkQ3Jvd2RzKSU+JW5hLm9taXQoKQpnbG0oQ292aWRfU3RhdHVzfldhc2hIYW5kK1dlYXJNYXNrK0tlZXAybStBdm9pZENyb3dkcywgZGF0YT1YeTIsIGZhbWlseSA9ICJiaW5vbWlhbCIpJT4lCiAgc3RhcmdhemVyKHR5cGUgPSAidGV4dCIsIHRpdGxlPSJUYWJsZSAzLjMuNzogTW9kZWwgRXN0aW1hdGVzIG9mIENPVklEIFN0YXR1cyB3aXRoIFByZXZlbnRhdGl2ZSBCZWhhdmlvdXJzIixkZXAudmFyLmxhYmVscyA9IGMoIkNvdmlkXFxfU3RhdHVzIiksIHJlcG9ydD0oInZjKnMqcCIpKQpgYGAKCiMgRGlzY3Vzc2lvbgoKIyMgTW9ydGFsaXR5CkZyb20gU2VjdGlvbiAzLjEsIHdlIGZvdW5kIHRoYXQgdGhlIHByb2JhYmlsaXR5IG9mIGRlYXRoIGNhdXNlZCBieSBDT1ZJRC0xOSBpcyBub3QgaG9tb2dlbmVvdXMgYWNyb3NzIHllYXJzLCB0aGVuIHdlIGNvbXB1dGVkIHRoZSByZWxhdGl2ZSByaXNrcyBhbmQgb2RkcyByYXRpb3MgZm9yIDIwMjEsMjAyMiBhbmQgMjAyMy4gV2Ugb2JzZXJ2ZWQgdGhhdCByZWxhdGl2ZSByaXNrIGluIDIwMjIgKFJSID0gMS4xNzE0KSBpbmRpY2F0ZXMgYSBoaWdoZXIgcmlzayBjb21wYXJlZCB0byB0aGUgMjAyMCwgd2hpbGUgcmVsYXRpdmUgcmlzayBpbiAyMDIxIChSUiA9IDAuOTQ0OSkgc3VnZ2VzdHMgYSBzbGlnaHRseSBsb3dlciByaXNrLiBOb3RhYmx5LCByZWxhdGl2ZSByaXNrIGluIDIwMjMgKFJSID0gMC40NzE0KSBzdGFuZHMgb3V0IHdpdGggYSBzaWduaWZpY2FudGx5IGxvd2VyIHJpc2ssIHN1Z2dlc3RpbmcgYSBwb3RlbnRpYWwgcHJvdGVjdGl2ZSBlZmZlY3QuIFRoZSBvZGRzIHJhdGlvIGluIDIwMjMgKE9SID0gMi4xNzkpIHN0YW5kcyBvdXQsIGluZGljYXRpbmcgYSBzaWduaWZpY2FudGx5IGhpZ2hlciBvZGRzIGNvbXBhcmVkIHRvIHRoZSBvZGRzIGluIDIwMjAuIEluIGNvbnRyYXN0LCBvZGRzIHJhdGlvIGluIDIwMjIgKE9SID0gMC44NDYxKSBzdWdnZXN0cyBhIGxvd2VyIG9kZHMsIHdoaWxlIG9kZHMgcmF0aW8gaW4gMjAyMSAoT1IgPSAxLjA2MTMpIGRlbW9uc3RyYXRlcyBhIHN1YnRsZSBpbmNyZWFzZS4KClRoZSBsb3dlciByaXNrIGFuZCBoaWdoZXIgb2RkcyBpbiAyMDIxIGFuZCAyMDIzIG1pZ2h0IGJlY2F1c2UgdGhlIHdpZGVzcHJlYWQgdmFjY2luYXRpb24gaW4gQ2FuYWRhLiBQdWJsaWMgSGVhbHRoIE9udGFyaW8gc3RhdGVzW0BQSE9dIHRoYXQgb3ZlciA3MC4yJSBvZiBPbnRhcmlvIHJlc2lkZW50cyByZWNlaXZlZCBhdCBsZWFzdCBvbmUgZG9zZSBvZiBDT1ZJRC0xOSB2YWNjaW5lIGluIHRoZSBmdWxsIHllYXIgMjAyMSwgb3ZlciA2MCUgY29tcGxldGVkIHR3byBkb3NlcyB2YWNjaW5hdGlvbi4gQWxzbywgdGhlIHZhY2NpbmUgc3RpbGwgaGFzIGhpZ2ggdmFjY2luZSBlZmZlY3RpdmVuZXNzIGFnYWluc3QgdmFyaWFudHMgb2YgY29uY2VybiBBbHBoYSBhbmQgZGVsdGEuIFRpbGwgT2N0b2JlciAyMDIzLCA4MC41JSBwZW9wbGUgaW4gdG90YWwgcG9wdWxhdGlvbiBpbiBDYW5hZGEgY29tcGxldGVkIHRoZWlyIHByaW1hcnkgc2VyaWVzIHZhY2NpbmF0aW9uLCBvdmVyIDQgbWlsbGlvbiBwZW9wbGUgcmVjZWl2ZWQgYm9vc3RlciBkb3NlICBQZml6ZXItQmlvTlRlY2ggQ29taXJuYXR5IHZhY2NpbmVbQFZDXS4gVGhlIHB1YmxpYyBoZWFsdGggcmVzdHJpY3Rpb25zIGFuZCBtYW5kYXRvcnkgbWFza2luZyBwb2xpY2llcyBkcm9wcGVkLCB0aGVyZSBoYXMgYWxzbyBiZWVuIGEgc2hpZnQgZnJvbSB0aGUgeW91bmcgdG8gdGhlIG9sZCwgd2l0aCBtb3JlIHRoYW4gODAlIG9mIGRlYXRocyBvY2N1cnJpbmcgaW4gcGF0aWVudHMgb3ZlciA2NSB5ZWFycyBvbGQgd2l0aCBjb21vcmJpZGl0aWVzW0BDQkNdLgoKIyMgTG9uZy10ZXJtIEltcGFjdAoKQmFzZWQgb24gdGhlIHJlc3VsdHMgZnJvbSBzZWN0aW9uIDMuMiwgVGhlIENoaS1zcXVhcmVkIHRlc3RzIHJldmVhbGVkIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYXNzb2NpYXRpb25zIGJldHdlZW4gYWdlIGdyb3VwcyBhbmQgdGhlIG9jY3VycmVuY2Ugb2YgbG9uZy10ZXJtIENPVklELTE5IHN5bXB0b21zIHdpdGhpbiBlYWNoIHNleCBjYXRlZ29yeSBhbmQgYmV0d2VlbiBzZXhlcyB3aXRoaW4gZWFjaCBhZ2UgZ3JvdXAuIFRoZSBPZGRzIFJhdGlvcyBjb25zaXN0ZW50bHkgc2hvd2VkIHRoYXQgZmVtYWxlcyBhcmUgbW9yZSBsaWtlbHkgdGhhbiBtYWxlcyB0byByZXBvcnQgbG9uZy10ZXJtIENPVklELTE5IHN5bXB0b21zIGluIGFsbCBhZ2UgZ3JvdXBzLlRoaXMgZGlzcGFyaXR5IGluIHRoZSBsaWtlbGlob29kIG9mIHN5bXB0b21zIGFwcGVhcnMgdG8gaW5jcmVhc2Ugd2l0aCBhZ2UsIHdpdGggdGhlIG9sZGVzdCBhZ2UgZ3JvdXAgKEFnZXMgNjUgYW5kIG92ZXIpIHNob3dpbmcgdGhlIGhpZ2hlc3QgT2RkcyBSYXRpby4KCk91ciBmaW5kaW5ncyByZXNvbmF0ZSB3aXRoIHNldmVyYWwgY2xpbmljYWwgc3R1ZGllcyB0aGF0IGhhdmUgc3VnZ2VzdGVkIGdlbmRlciBkaWZmZXJlbmNlIGluIHRoZSBpbXBhY3Qgb2YgbG9uZ19DT1ZJRC0xOSBzeW5kcm9tZS5TcGVjaWZpY2FsbHksIHRoZSBoaWdoZXIgbGlrZWxpaG9vZCBvZiBsb25nLXRlcm0gc3ltcHRvbXMgaW4gZmVtYWxlcyBpcyBjb25zaXN0ZW50IHdpdGggcHVibGljIGhlYWx0aCByZXNlYXJjaGVzIHRoYXQgd29tZW4gbWlnaHQgZXhwZXJpZW5jZSBDT1ZJRC0xOSBkaWZmZXJlbnRseSB0aGFuIG1lbi5bQEJhaTIwMjEtdmJdIEhvd2V2ZXIgb3VyIHN0dWR5IGlzIGJhc2VkIG9uIGFnZ3JlZ2F0ZWQgZGF0YSBmb2N1c2luZyBwcmltYXJpbHkgb24gdGhlIGFzc29jaWF0aW9uIG9mIHNleCBhbmQgYWdlIHdpdGggbG9uZy10ZXJtIENPVklELTE5IHN5bXB0b21zLiBXaGlsZSB0aGlzIHByb3ZpZGVzIHZhbHVhYmxlIGluc2lnaHRzLCB0aGUgZGF0YSBkb2VzIG5vdCBpbmNsdWRlIGluZGl2aWR1YWwgcGF0aWVudCBzdGF0ZXMgdGhhdCBjb3VsZCBpbmZsdWVuY2UgdGhlIGZpbmRpbmdzLiBNb3Jlb3ZlciwgVGhlIG5hdHVyZSBvZiB0aGUgZGF0YSBhbmQgdGhlIGFuYWx5dGljYWwgbWV0aG9kcyB1c2VkIChDaGktc3F1YXJlZCB0ZXN0cyBhbmQgT2RkcyBSYXRpb3MpIGFyZSBlZmZlY3RpdmUgZm9yIGlkZW50aWZ5aW5nIGFzc29jaWF0aW9ucyBidXQgZG8gbm90IGVzdGFibGlzaCBjYXVzYXRpb24uIAoKRnVydGhlciBzdHVkaWVzIGludm9sdmluZyBtb3JlIGRldGFpbGVkIGRhdGEgc2hvdWxkIGFpbSB0byB1bmNvdmVyIHRoZSBiaW9sb2dpY2FsLCBzb2NpYWwsIGFuZCBiZWhhdmlvcmFsIG1lY2hhbmlzbXMgZHJpdmluZyB0aGUgb2JzZXJ2ZWQgZ2VuZGVyIGRpZmZlcmVuY2VzIGluIGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcy4gU29tZSBzdHVkeVtASnVzemtvMjAyMi1vcV0gc3VnZ2VzdHMgdGhhdCBwc3ljaG9sb2dpY2FsIGZhY3RvcnMgYWxzbyBoYXZlIGNvcnJlbGF0aW9uIGluIGJvdGggd29tZW4gYW5kIG1lbiB3aXRoIHNlbGYtcmVwb3J0ZWQgaGVhbHRoIGFmdGVyIENPVklELTE5LiBUaGUgc3R1ZHkgY2xlYXJseSBpbmRpY2F0ZXMgYSBzaWduaWZpY2FudCBnZW5kZXIgZGlzcGFyaXR5IGluIHRoZSBtZW50YWwgaGVhbHRoIGltcGFjdCBvZiBDT1ZJRC0xOSBkdXJpbmcgdGhlIHJlY3VwZXJhdGlvbiBwZXJpb2QuCgojIyBQcmV2YWxlbmNlIE1vZGVsaW5nCgpGcm9tIFNlY3Rpb24gMy4zIHdlIGhhdmUgZm91bmQgdGhhdCB0aGUgb2RkcyByYXRpbyBvZiBDT1ZJRC0xOSB3YXMgcmVsYXRlZCB0byB0d28gY292YXJpYXRlczogdGhlIHZhY2NpbmF0aW9uIHN0YXR1cyBhbmQgdGhlIGFudGlib2R5IHByZXNlbnRlZCBpbiBibG9vZC4gU3BlY2lmaWNhbGx5LCB3ZSBpbnRlcnByZXRlZCB0aGUgY29lZmZpY2llbnRzIGFzIHRoZSBsb2ctb2RkcyBmb3IgaXRzIGNvcnJlc3BvbmRpbmcgY292YXJpYXRlLiAKCiQkClxsbntPUn09XGJldGFfaiwgXHF1YWQgT1I6PVxmcmFje3BfMigxLXBfMSl9e3BfMSgxLXBfMil9CiQkCgpJbiBvdGhlciB3b3JkcywgJGVee1xiZXRhX2p9JCBpcyB0aGUgbWFyZ2luYWwgaW5jcmVhc2UvZGVjcmVhc2UgaW4gdGhlIG9kZHMgZm9yIGEgb24tdW5pdCBpbmNyZWFzZS9kZWNyZWFzZSBpbiB0aGUgY292YXJpYXRlLCBhc3N1bWluZyBhbGwgb3RoZXIgY292YXJpYXRlcyBoZWxkIGNvbnN0YW50LiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIGNvbnN0YW50IGNvZWZmaWNpZW50ICRcYmV0YV8wJCBpcyBpbnRlcnByZXRlZCBhcyB0aGUgbG9nLW9kZHMgJFxsbnsoXGZyYWN7cF8xfXsxLXBfMX0pfSQgd2l0aCBhbGwgY292YXJpYXRlcyB1bmNoYW5nZWQuIEZyb20gb3VyIHN1bW1hcnkgVGFibGUgMy4zLjYgb25lIGNhbiBzZWUgdGhhdCB0aGUgY29lZmZpY2llbnQgZm9yIHRoZSB2YWNjaW5lIHN0YXR1cyB3YXMgbmVnYXRpdmUsIGluZGljYXRpbmcgdGhhdCB0aGUgb2RkcyBvZiBoYXZpbmcgYSBwb3NpdGl2ZSBDT1ZJRCB0ZXN0IGRlY3JlYXNlcyBpZiB2YWNjaW5lIHdhcyBnaXZlbi4gVGhpcyByZXN1bHQgd2Fzbid0IHN1cnByaXNpbmcgdGhhdCB0aGUgdXNlIG9mIHZhY2NpbmVzIGhhcyBzbyBmYXIgaGVscGVkIHRoZSBodW1hbml0eSBjb21iYXQgdGhpcyB2aXJ1cy4gVGhlIGNvZWZmaWNpZW50IGZvciB0aGUgaW5kZXRlcm1pbmF0ZSBhbnRpYm9keSByZXN1bHQgd2FzIHBvc2l0aXZlLCBhbmQgdGhlIG9uZSBmb3IgdGhlIHBvc2l0aXZlIGFudGlib2R5IHJlc3VsdCB3YXMgZXZlbiBoaWdoZXIuIFdlIG11c3QgcG9pbnQgb3V0IHRoYXQgb25lIG5lZWRzIHRvIGNhcmVmdWxseSBpbnRlcnByZXQgdGhpcyByZXN1bHQuIEl0IG1lYW50IHRoYXQgdGhlIG9kZHMgb2YgZ2V0dGluZyBhIHBvc2l0aXZlIENPVklEIHRlc3QgaXMgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggdGhlIHJlc3VsdCBvZiBhbiBhbnRpYm9keSB0ZXN0LiBUaGUgbW9yZSBwb3NpdGl2ZSB0aGUgYW50aWJvZHkgdGVzdCBpcywgdGhlIGhpZ2hlciB0aGUgb2RkcyBvZiBoYXZpbmcgYSBwb3NpdGl2ZSBDT1ZJRCB0ZXN0IGFzIHdlbGwuIEhvd2V2ZXIsIGFudGlib2R5IHRlc3QgYW5kIHRoZSBDT1ZJRC0xOSBkaWFnbm9zdGljIHRlc3QgYXJlIG5vdCB0aGUgc2FtZSB0aGluZyBpbiB0aGUgZXhwbGFpbmF0aW9ucyBwcm92aWRlZCBieSBGREEgW0BBbnRpYm9keV0uIFRoZSBhbnRpYm9keSB0ZXN0IGRvZXMgbm90IGRldGVjdCB0aGUgdmlydXMuIFJhdGhlciwgaXQgbWVyZWx5IHRlbGxzIGlmIGEgcGVyc29uIG1heSBoYXZlIGhhZCBhIFBSSU9SIGluZmVjdGlvbiwgdGh1cyBpdCBkb2VzIG5vdCByZWZsZWN0IGlmIHRoZSBwZXJzb24gaXMgY3VycmVudGx5IGluZmVjdGVkIG9yIG5vdC4gSW4gYWRkaXRpb24sIHRoZSBhbnRpYm9keSB0ZXN0IGNvdWxkIHNob3cgaWYgYSBwZXJzb24gaGFzIGJlZW4gdmFjY2luYXRlZCBvciBub3QsIGJ1dCBpbiBnZW5lcmFsIGFuIGFudGlib2R5IHRlc3QgbWF5IG5vdCBkZXRlY3QgdGhlIGtpbmQgb2YgYW50aWJvZGllcyBjcmVhdGVkIGJ5IHZhY2NpbmVzLCB0aGVyZWZvcmUgaXQgZGVwZW5kcyBvbiB0aGUgdHlwZSBvZiBhbnRpYm9keSB0ZXN0IHBlcmZvcm1lZC4gRnJvbSBvdXIgcmVzdWx0IHdlIHdlcmUgb25seSBhYmxlIHRvIHNheSB0aGF0IHRoZXJlIHdhcyBhIHBvc2l0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBDT1ZJRCBkaWFnbm9zdGljIHRlc3QgYW5kIHRoZSBhbnRpYm9keSB0ZXN0LCB3aGljaCB3YXMgbm90IHN1cnByaXNpbmcgYmVjYXVzZSBpbiBvcmRlciB0byBzaG93IHBvc2l0aXZlIGluIGFuIGFudGlib2R5IHRlc3QsIG9uZSBtdXN0IGhhdmUgaGFkIENPVklEIHRvIGJlZ2luIHdpdGguIFRoaXMgaW5mb3JtYXRpb24gbWF5IGJlIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHRoYXQgb25lIG9mIHRoZSB0ZXN0cyBpcyBlY29ub21pY2FsbHkgbW9yZSBhZmZvcmRhYmxlIGFuZCBjYW4gYmUgdXNlZCBhcyBhIHByZWxpbWluYXJ5IHNjcmVlbmluZyBtZXRob2QuCgpGcm9tIHRoZSBzZWNvbmQgbW9kZWwgZml0dGluZyBmb3IgcHJldmVudGF0aXZlIGJlaGF2aW91cnMsIHdlIGZvdW5kIHRoYXQgb25seSB3YXNoaW5nIGhhbmQgd2FzIHNob3dpbmcgYSBuZWdhdGl2ZSBlZmZlY3Qgb24gdGhlIG9kZHMgb2YgZ2V0dGluZyBDT1ZJRC4gV2Ugd2VyZW4ndCBhYmxlIHRvIGRyYXcgYW55IGNvbmNsdXNpb24gZm9yIG90aGVyIHByZXZlbnRhdGl2ZSBiZWhhdmlvdXJzLCBidXQgd2UgdGhvdWdodCBpdCB3YXMgaW5ldml0YWJseSBoYXJkIHRvIGZpbmQgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgQ09WSUQgc3RhdHVzIGFuZCB0aG9zZSBiZWhhdmlvdXJzIGJlY2F1c2UgcGVvcGxlIG1heSBub3QgYW5zd2VyIHRoZSBxdWVzdGlvbm5haXJlIGFjY3VyYXRlbHkuIFBlb3BsZSBtaWdodCBmaW5kIGRpZmZpY3VsdCB0byBkaXN0aW5ndWlzaCB0aGUgYm91bmRhcnkgYmV0d2VlbiB3ZWFyaW5nIG1hc2sgb2Z0ZW4gYW5kIGFsd2F5cy4gUGVvcGxlIGNhbiBldmVuIGZhbHNlbHkgYW5zd2VyIHRoYXQgdGhleSBrZWVwIGEgZGlzdGFuY2Ugb2YgMiBtZXRyZXMgb3IgbW9yZSBidXQgaW4gcmVhbGl0eSB0aGV5IGhhdmUgbm90IGRvbmUgc28uIFRoZSByZXN1bHRpbmcgYW5zd2VycyBmb3IgdGhlIHN1cnZleSB0aGVyZWZvcmUgbWF5IG5vdCBiZSBhcyByZWxpYWJsZS4gVGh1cyB3ZSB0aG91Z2h0IGl0IGlzIGdlbmVyYWxseSBkaWZmaWN1bHQgdG8gYWNjdXJhdGVseSBkZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcHJldmFsZW5jZSBvZiBkaXNlYXNlIGFuZCBwcmV2ZW50YXRpdmUgYmVoYXZpb3VyLiBSZXNlYXJjaGVycyBoYXZlIHRvIGRlc2lnbiBleHBlcmltZW50cyBhbmQgZmluZCB3YXlzIHRvIHF1YW50aWZ5IHRoZSBiZWhhdmlvdXIgaW4gb3JkZXIgdG8gaGF2ZSBtb3JlIHJlbGlhYmxlIG91dGNvbWVzLiAKCiMgQ29uY2x1c2lvbgpJbiBNb3J0YWxpdHkgc2VjdGlvbiwgd2UgZm91bmQgdGhhdCB0aGVyZSBleGlzdCBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluICBwcm9iYWJpbGl0eSBvZiBkZWF0aCBjYXVzZWQgYnkgQ09WSUQtMTkgYWNyb3NzIHllYXJzLiAyMDIyIGhhcyB0aGUgcmVsYXRpdmUgcmlzayBncmVhdGVyIHRoYW4gMSBhbmQgb2RkcyByYXRpbyBsZXNzIHRoYW4gMSwgd2hpY2ggaW5kaWNhdGUgdGhlIG5lZ2F0aXZlIGFzc29jaWF0aW9uLCBpbmRpY2F0aW5nIGFuIGRlY3JlYXNlZCBsaWtlbGlob29kIG9mIHRoZSBpbiBwcm9iYWJpbGl0eSBpbiBDT1ZJRC0xOSBkZWF0aCBpbiB0aGVzZSB5ZWFycy5HaXZlbiB0aGUgY2hhbmdlIGluIHRoZSBkZW1vZ3JhcGhpYyBvZiB0aGUgYWZmZWN0ZWQgcG9wdWxhdGlvbiwgaXQgaXMgZXNzZW50aWFsIHRvIGFja25vd2xlZGdlIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSByaXNlIGluIG1vcnRhbGl0eSBhbW9uZyBvbGRlciBpbmRpdmlkdWFscyBpbiB0aGUgbGF0ZXIgc3RhZ2VzIG9mIHRoZSBlcGlkZW1pYyBjb3VsZCBiZSBhdHRyaWJ1dGVkIHRvIGNvbXBsaWNhdGlvbnMgcmF0aGVyIHRoYW4gdGhlIGRpcmVjdCBpbXBhY3Qgb2YgQ09WSUQtMTkgaXRzZWxmLiBJbiBmdXR1cmUgcmVzZWFyY2gsIGl0IHdvdWxkIGJlIHZhbHVhYmxlIHRvIGV4cGxvcmUgdGhlIGluZmx1ZW5jZSBvZiBjb21wbGljYXRpb25zIG9uIHRoZSBkZWF0aCBhZnRlciBpbmZlY3Rpb25zLgoKd2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBhc3NvY2lhdGlvbiBiZXR3ZWVuIGFnZSBhbmQgZ2VuZGVyIHdpdGggdGhlIG9jY3VycmVuY2Ugb2YgbG9uZy10ZXJtIENPVklELTE5IHN5bXB0b21zLiBOb3RhYmx5LCBmZW1hbGVzIGFjcm9zcyBhbGwgYWdlIGdyb3VwcywgZXNwZWNpYWxseSB0aG9zZSBhZ2VkIDY1IGFuZCBvdmVyLCBhcmUgbW9yZSBsaWtlbHkgdG8gcmVwb3J0IHRoZXNlIHN5bXB0b21zIGNvbXBhcmVkIHRvIG1hbGVzLkhvd2V2ZXIsIGl0J3MgaW1wb3J0YW50IHRvIHJlY29nbml6ZSB0aGF0IG91ciBzdHVkeSwgd2hpbGUgaGlnaGxpZ2h0aW5nIGNydWNpYWwgYXNzb2NpYXRpb25zLCBkb2VzIG5vdCBkZWx2ZSBpbnRvIHRoZSBjYXVzYWwgbWVjaGFuaXNtcyBkdWUgdG8gaXRzIHJlbGlhbmNlIG9uIGFnZ3JlZ2F0ZWQgZGF0YS4gVGhpcyBsaW1pdGF0aW9uIHVuZGVyc2NvcmVzIHRoZSBuZWVkIGZvciBmdXJ0aGVyIHJlc2VhcmNoIHdpdGggbW9yZSBjb21wcmVoZW5zaXZlIGRhdGEgdG8gZXhwbG9yZSB0aGUgdW5kZXJseWluZyBiaW9sb2dpY2FsLCBzb2NpYWwsIGFuZCBwc3ljaG9sb2dpY2FsIGZhY3RvcnMgY29udHJpYnV0aW5nIHRvIHRoZXNlIG9ic2VydmVkIGRpZmZlcmVuY2VzIGluIGxvbmctdGVybSBDT1ZJRC0xOSBzeW1wdG9tcy4KCldlIGZvdW5kIGluIFByZXZhbGVuY2UgTW9kZWxpbmcgc2VjdGlvbiB0aGF0IHRoZSBDT1ZJRCBzdGF0dXMgaXMgbmVnYXRpdmVseSBhc3NvY2lhdGVkIHdpdGggdGhlIHZhY2NpbmF0aW9uIHN0YXR1cywgaW5kaWNhdGluZyB0aGF0IHZhY2NpbmVzIHdhcyBhIHNpZ25pZmljYW50IGZhY3RvciB0byBsb3dlciB0aGUgcHJldmFsZW5jZSBvZiB0aGUgdmlydXMuIFdlIGFsc28gZm91bmQgYnV0IG5vdCBzdXJwcmlzaW5nIHRoYXQgdGhlIGFudGlib2R5IHRlc3QgcmVzdWx0IHdhcyBwb3NpdGl2ZWx5IHJlbGF0ZWQgdG8gdGhlIENPVklEIHN0YXR1cy4gSW4gYWRkaXRpb24sIHdlIGRpZCBjb25maXJtIHRoYXQgd2FzaGluZyBoYW5kcyBjYW4gcmVzdWx0IGluIGEgbmVnYXRpdmUgaW5mbHVlbmNlIG9uIHRoZSBwcmV2YWxlbmNlIG9mIENPVklELCBidXQgd2UgY291bGQgbm90IGZpbmQgdGhlIHNhbWUgY29uY2x1c2lvbiBmb3Igb3RoZXIgcHJldmVudGF0aXZlIGJlaGF2aW91cnMuCgojIFJlZmVyZW5jZXMK